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

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


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)

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.