matplotlib colorbar dla scatter

89

Pracuję z danymi, których dane mają 3 parametry kreślenia: x, y, c. Jak utworzyć niestandardową wartość koloru dla wykresu punktowego?

Rozszerzając ten przykład , próbuję zrobić:

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()

ale wynik jest TypeError: You must first set_array for mappable

Adam Greenhall
źródło

Odpowiedzi:

196

Z dokumentów matplotlib na scatter 1 :

cmap jest używane tylko wtedy, gdy c jest tablicą liczb zmiennoprzecinkowych

Dlatego lista kolorów musi być listą pływaków, a nie listą krotek, jaką masz teraz. plt.colorbar () chce mapowalnego obiektu, takiego jak CircleCollection, który zwraca plt.scatter (). vmin i vmax mogą wtedy kontrolować granice paska kolorów. Rzeczy poza vmin / vmax otrzymują kolory punktów końcowych.

Jak to działa dla Ciebie?

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()

Przykład obrazu

matowe
źródło
Spróbowałem i dostałem 'AxesSubplot' object has no attribute 'colorbar'. Zrobiłem ax.colorbar()... co ja robię źle?
Lucas Aimaretto
Ten przykład nie zapewnia przejrzystej aplikacji podczas korzystania z interfejsu matplotlib OOP: matplotlib.org/gallery/api/agg_oo_sgskip.html
Ryszard Cetnarski
18

Oto sposób OOP dodawania paska kolorów:

fig, ax = plt.subplots()
im = ax.scatter(x, y, c=c)
fig.colorbar(im, ax=ax)
neuryt
źródło
Kiedy to robię, w końcu wykres zostaje całkowicie przeskalowany, tak że wszystkie punkty znajdują się w kawałku wykresu po prawej stronie, a pasek kolorów jest bardzo cienką linią na dole.
Marses
Właściwa odpowiedź, używając bezpośrednio pltdo kreślenia paska kolorów, nie jest według mnie zalecanym sposobem. Wasz sposób jest godny pochwały.
GoingMyWay
2

Jeśli chcesz rozproszyć dwie zmienne i kolor według trzeciej, Altair może być świetnym wyborem.

Tworzenie zbioru danych

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'])

Działka Altaira

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

Wątek

wprowadź opis obrazu tutaj

Nipun Batra
źródło