matplotlib colorbar untuk pencar

92

Saya bekerja dengan data yang memiliki data memiliki 3 parameter plot: x, y, c. Bagaimana Anda membuat nilai warna kustom untuk sebar plot?

Memperluas contoh ini yang saya coba lakukan:

import matplotlib
import matplotlib.pyplot as plt
cm = matplotlib.cm.get_cmap('RdYlBu')
colors=[cm(1.*i/20) for i in range(20)]
xy = range(20)
plt.subplot(111)
colorlist=[colors[x/2] for x in xy] #actually some other non-linear relationship
plt.scatter(xy, xy, c=colorlist, s=35, vmin=0, vmax=20)
plt.colorbar()
plt.show()

tetapi hasilnya adalah TypeError: You must first set_array for mappable

Adam Greenhall
sumber

Jawaban:

201

Dari dokumen matplotlib di pencar 1 :

cmap hanya digunakan jika c adalah larik pelampung

Jadi daftar warna harus berupa daftar pelampung daripada daftar tupel seperti yang Anda miliki sekarang. plt.colorbar () menginginkan objek yang dapat dipetakan, seperti CircleCollection yang dikembalikan oleh plt.scatter (). vmin dan vmax kemudian dapat mengontrol batas colorbar Anda. Hal-hal di luar vmin / vmax mendapatkan warna titik akhir.

Bagaimana cara kerjanya untuk Anda?

import matplotlib.pyplot as plt
cm = plt.cm.get_cmap('RdYlBu')
xy = range(20)
z = xy
sc = plt.scatter(xy, xy, c=z, vmin=0, vmax=20, s=35, cmap=cm)
plt.colorbar(sc)
plt.show()

Contoh Gambar

Matt
sumber
Saya mencobanya dan mendapatkannya 'AxesSubplot' object has no attribute 'colorbar'. Saya telah melakukan ax.colorbar()... apa yang saya lakukan salah?
Lucas Aimaretto
Contoh ini tidak memberikan aplikasi yang jelas saat menggunakan antarmuka OOP matplotlib
Ryszard Cetnarski
20

Berikut adalah cara OOP untuk menambahkan colorbar:

fig, ax = plt.subplots()
im = ax.scatter(x, y, c=c)
fig.colorbar(im, ax=ax)
neurit
sumber
Ketika saya melakukan ini, saya berakhir dengan plot yang benar-benar diubah ukurannya sehingga semua titik berada dalam sepotong plot di paling kanan, dan colorbar adalah garis yang sangat tipis di bagian bawah.
Marses
Jawaban yang benar, langsung menggunakan pltuntuk memplot colorbar bukanlah cara yang disarankan menurut saya. Cara Anda terpuji.
GoingMyWay
2

Jika Anda ingin membagi dua variabel dan mewarnai dengan ketiga, Altair bisa menjadi pilihan yang bagus.

Membuat dataset

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

df = pd.DataFrame(40*np.random.randn(10, 3), columns=['A', 'B','C'])

Plot Altair

from altair import *
Chart(df).mark_circle().encode(x='A',y='B', color='C').configure_cell(width=200, height=150)

Merencanakan

masukkan deskripsi gambar di sini

Nipun Batra
sumber