2016-07-29 9 views
5

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. enter image description here

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) 

enter image description here

Und hier ist es, was es mit einem Standard, unveränderter Farbbereich aussieht. (Gleicher Code minus der Norm = Norm Argument.)

enter image description here

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?

+2

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

+0

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

+0

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

Antwort

0

A hack

Sie könnten versuchen, einen maximalen Wert der Anwendung, dh für einen beliebigen Wert über 2 einfach ersetzen Sie es mit 2.

Dann würden Sie eine einzige Farbe haben (das Maximum), die 2+ und die Der Rest der Farben würde gleichmäßig über Ihre Daten verteilt.

+0

Ich habe das irgendwann gemacht, aber ich musste auch meine Normalisierung auf PowerNorm umstellen und mit der Waage herumspielen. – ChristineB

Verwandte Themen