Die AusgabePython: Welches Colormap-Schema soll ich für Exponential-Daten verwenden?
ich ein Grundstück habe ich auf der ganzen Welt für Trends der Niederschlagsraten zu machen bin versucht, gerasterten Daten. Ich kann die Handlung selbst gut machen, aber die Farbpalette gibt mir Probleme. Ich kann nicht herausfinden, wie ich die Farbkarte besser an meine Daten anpassen kann, was exponentiell erscheint. Ich habe einen logarithmischen Bereich versucht, aber es stimmt nicht ganz mit den Daten überein.
Der Code & Datenbereich
Hier ist, was wie meine 8192 Datenwerte aussehen, wenn, um auf einem einfachen x-y-Liniendiagramm dargestellt. Datenpunkte sind auf der X-Achse & Werte sind auf der Y-Achse.
Hier ist, wie meine Daten mit einem LogNormal-Farbraum geplottet aussehen. Es ist zu viel mintgrün & orange-rot für mich.
#Set labels
lonlabels = ['0','45E','90E','135E','180','135W','90W','45W','0']
latlabels = ['90S','60S','30S','Eq.','30N','60N','90N']
#Set cmap properties
norm = colors.LogNorm() #creates logarithmic scale
#Create basemap
fig,ax = plt.subplots(figsize=(15.,10.))
m = Basemap(projection='cyl',llcrnrlat=-90,urcrnrlat=90,llcrnrlon=0,urcrnrlon=360.,lon_0=180.,resolution='c')
m.drawcoastlines(linewidth=1)
m.drawcountries(linewidth=1)
m.drawparallels(np.arange(-90,90,30.),linewidth=0.3)
m.drawmeridians(np.arange(-180.,180.,45.),linewidth=0.3)
meshlon,meshlat = np.meshgrid(lon,lat)
x,y = m(meshlon,meshlat)
#Plot variables
trend = m.pcolormesh(x,y,lintrends[:,:,0],cmap='jet', norm=norm, shading='gouraud')
#Set plot properties
#Colorbar
cbar=m.colorbar(trend, size='8%',location='bottom',pad=0.8) #Set colorbar
cbar.set_label(label='Linear Trend (mm/day/decade)',size=25) #Set label
for t in cbar.ax.get_xticklabels():
t.set_fontsize(25) #Set tick label sizes
#Titles & labels
fig.suptitle('Linear Trends of Precipitation (CanESM2)',fontsize=40,x=0.51,y=0.965)
ax.set_title('a) 1979-2014 Minimum Trend',fontsize=35)
ax.set_xticks(np.arange(0,405,45))
ax.set_xticklabels(lonlabels,fontsize=20)
ax.set_ylabel('Latitude',fontsize=25)
ax.set_yticks(np.arange(-90,120,30))
ax.set_yticklabels(latlabels,fontsize=20)
Und hier ist es, was es mit einem Standard, unveränderter Farbbereich aussieht. (Gleicher Code minus der Norm = Norm Argument.)
Die Frage
Gibt es ein mathematisches Schema kann ich verwende eine colormap zu schaffen, die besser die Reichweite meiner Daten zeigen? Oder muss ich einen benutzerdefinierten Bereich erstellen?
Wenn es also die Farben sind, die Sie nicht mögen, können Sie eine andere Farbkarte wählen. Hier ist eine Liste von möglichen Colormaps. http://matplotlib.org/examples/color/colormaps_reference.html. Sie sollten auch überprüfen, ob die 'PowerNorm' anstelle von' LogNorm' für das, was Sie anzeigen möchten, besser ist. – cel
Es sind nicht so sehr die Farben selbst als die Reichweite. Wenn ich mehr Blues, Cyan und Gelb auf der Karte sehen könnte, wäre ich glücklich. Wie auch immer, ich spielte früher mit PowerNorm und es schien nicht zu funktionieren, aber ich habe es einfach nochmal probiert & nachdem ich vmax = 3 eingestellt habe, sieht es nun gleichmäßiger aus, wenn auch ein wenig schwer auf dem dunklen Blues Nullwerte. (Nicht viel kann ich dagegen tun.) Posten Sie dies als Antwort und ich werde es akzeptieren. – ChristineB
Zu einem verwandten Hinweis: [Bitte verwenden Sie nicht die Jet-Colormap] (http://stats.stackexchange.com/questions/223315/why-use-colormap-viridis-over-jet). Da der gelbe Teil der Farbtabelle heller ist als der rote oder blaue Teil, macht er auf die Medianwerte Ihres Arrays aufmerksam, die aus Sicht der Datenvisualisierung am wenigsten interessant sind. Es gibt [viele passende Colormaps] (http://matplotlib.org/users/colormaps.html), die Ihre Plots besser aussehen lassen :). – Andreq