2017-02-08 3 views
2

Ist es möglich, plt.scatter in die gleichen Farbniveaus wie plt.contourf und plt.contour zu zwingen? Zum Beispiel habe ich Code, der eine Handlung wie das macht:Streudiagramm und Konturdiagramm mit denselben Farben

enter image description here

die erste subplot zu machen, verwende ich

cs=m[0].scatter(xs,ys,c=obsData,cmap=plt.cm.jet) 
m.colorbar(cs) 

Um den zweiten subplot zu machen, verwende ich

cs2=m[1].contourf(x,y,areaData,cmap=cs.cmap) 

Und für jedes nachfolgende Unterplot verwende ich

m[ind].contourf(x,y,areaData,cmap=cs.cmap,levels=cs2.levels 

wo areaData innerhalb einer Schleife neu berechnet wird.

Meine Frage ist, wie kann ich erzwingen, dass der erste Subplot die gleichen Farben wie die anderen Subplots hat? Ich suche nach einem Äquivalent zum levels=cs2.levels Schlüsselwortargument.

+0

Das Streudiagramm ist mit "obsData" eingefärbt, die Konturdiagramme sind jedoch gemäß 'areaData' farbig. Das sacatter-Diagramm hat Werte über 8, die Konturenwerte unter 7. Sind Sie sicher, dass diese Daten dem gleichen Datensatz entsprechen? Sonst macht es keinen Sinn, für beide die gleiche Farbkarte zu erzwingen. Fehle ich etwas? –

+0

Sie stammen nicht aus demselben Dataset, tatsächlich stammt keiner der Subplots aus demselben Dataset. Trotz dieses Unterschieds werden obsData Fehlerdaten aus der Simulation beobachtet, während es sich bei areaData um Daten handelt, die Unsicherheit aus der Simulation gegenüber unterschiedlichen Faktoren enthalten. Ich möchte den Fehler mit der Ungewißheit vergleichen, aber um dies richtig zu tun, ist eine einheitliche Färbung erforderlich. – BarocliniCplusplus

Antwort

1

Wie Sie in einem Kommentar notiert haben, sind Ihre Scatter- und Konturdaten nicht direkt miteinander verknüpft, Sie möchten sie jedoch in derselben Colormap anzeigen.

Ich empfehle, einen gemeinsamen Farbbereich einzustellen, der beide Datensätze enthält. Da obsData zu den Streupunkten und areaData an die Konturen bezieht, würde ich gesetzt

vmin,vmax = (fun(np.concatenate([obsData,areaData])) for fun in (np.min,np.max)) 

die Spannweite der gesammelten Datenmenge zu bestimmen (natürlich, um für mehrere Eingangsdatensätzen verallgemeinert werden). Diese können zu scatter und contourf übergeben werden, um die Grenzen der Farbzuordnung zu setzen:

cs = m[0].scatter(xs,ys,c=obsData,cmap=plt.cm.viridis,vmin=vmin,vmax=vmax) 
cs2 = m[1].contourf(x,y,areaData,cmap=cs.cmap,vmin=vmin,vmax=vmax) 

Einige manuelle Erhöhung der Spanne könnte sein, um ein hübsches Ergebnis zu erhalten.

Beachten Sie, dass ich die Colormap in viridis geändert habe. Wenn Sie Ihre Daten wirklich fair darstellen möchten, geben Sie this should be your first step an.

Verwandte Themen