Matplotlib Colorbar für Streuung

85

Ich arbeite mit Daten, deren Daten 3 Plotparameter haben: x, y, c. Wie erstellen Sie einen benutzerdefinierten Farbwert für ein Streudiagramm?

Ich versuche dieses Beispiel zu erweitern:

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

aber das Ergebnis ist TypeError: You must first set_array for mappable

Adam Greenhall
quelle

Antworten:

192

Aus den Matplotlib-Dokumenten zu Streuung 1 :

cmap wird nur verwendet, wenn c ein Array von Floats ist

Die Farbliste muss also eine Liste von Floats sein und keine Liste von Tupeln, wie Sie sie jetzt haben. plt.colorbar () möchte ein zuordnbares Objekt wie die CircleCollection, die plt.scatter () zurückgibt. vmin und vmax können dann die Grenzen Ihrer Farbleiste steuern. Dinge außerhalb von vmin / vmax erhalten die Farben der Endpunkte.

Wie funktioniert das bei Ihnen?

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

Bildbeispiel

matt
quelle
Ich habe es versucht und bekommen 'AxesSubplot' object has no attribute 'colorbar'. Ich habe getan ax.colorbar()... was mache ich falsch?
Lucas Aimaretto
Dieses Beispiel bietet keine eindeutige Anwendung, wenn die OOP-Schnittstelle von matplotlib verwendet wird: matplotlib.org/gallery/api/agg_oo_sgskip.html
Ryszard Cetnarski
16

Hier ist die OOP-Methode zum Hinzufügen einer Farbleiste:

fig, ax = plt.subplots()
im = ax.scatter(x, y, c=c)
fig.colorbar(im, ax=ax)
Neurit
quelle
Wenn ich das mache, wird das Diagramm vollständig neu skaliert, sodass sich alle Punkte innerhalb eines Splitters des Diagramms ganz rechts befinden und die Farbleiste eine sehr dünne Linie über dem unteren Rand ist.
Marses
Die richtige Antwort, direkt pltzum Zeichnen von Farbbalken, ist meiner Meinung nach keine empfohlene Methode. Dein ist ein empfohlener Weg.
GoingMyWay
2

Wenn Sie nach zwei Variablen streuen und nach der dritten Farbe streuen möchten , ist Altair eine gute Wahl.

Datensatz erstellen

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

Altair Grundstück

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

Handlung

Geben Sie hier die Bildbeschreibung ein

Nipun Batra
quelle