2016-12-05 1 views
0

Sagen Sie bitte ein Bild mit imshow wie folgt erstellen:Matplotlib: Wie "schneidet" man den unerwünschten Teil einer Farbleiste?

plt.set_cmap('viridis') 
im=plt.imshow(mydata, interpolation='nearest',origin='lower') 
plt.title('mymap') 
cbar=plt.colorbar() 
a=round(mydata.max(),0) 
cbar.set_ticks([17,23,a]) 
cbar.set_ticklabels([17,23,a]) 

Angenommen, Sie haben ein kontinuierliches artiges Daten-Set, wo die meisten Werte 0 sind, aber dann gibt es einen Sprung auf den Bereich von höchsten Werten führt.

How do you "cut" die colorbar sicherzustellen, dass es von mydata.min()=17 beginnt, endet bei mydata.max()=27, ohne in dem Bild, um die Farben zu ändern?


Ich will das nicht:

enter image description here

Antwort

1

Es gibt keine Standardlösung ist die Farbe für die Begrenzung Bereich in einer Farbleiste, weil die gezeigte co lors sind normalerweise direkt mit den Farben im Bild verknüpft.

Die Lösung wäre also, eine Farbleiste zu erstellen, die unabhängig vom Bild ist und mit einer anderen Farbkarte gefüllt wird. Diese zusätzliche Farbkarte kann aus dem Original entnommen werden, indem der entsprechende Teil ausgeschnitten wird.

import matplotlib.pyplot as plt 
import matplotlib 
import matplotlib.colors 
import numpy as np 

# some data between 0 and 27 
image = np.random.rand(30,60)*27 
image[:,30:] = np.sort(image[:,30:].flatten()).reshape(30,30) 


plt.figure(figsize=(8,3)) 
cmap = plt.get_cmap('jet') 
im=plt.imshow(image, interpolation='nearest',origin='lower', cmap = cmap) 
plt.title('mymap') 


a=round(image.max(),0) 

vmin=17 #minimum value to show on colobar 
vmax = a #maximum value to show on colobar 
norm = matplotlib.colors.Normalize(vmin=vmin, vmax =vmax) 
#generate colors from original colormap in the range equivalent to [vmin, vamx] 
colors = cmap(np.linspace(1.-(vmax-vmin)/float(vmax), 1, cmap.N)) 
# Create a new colormap from those colors 
color_map = matplotlib.colors.LinearSegmentedColormap.from_list('cut_jet', colors) 

# create some axes to put the colorbar to 
cax, _ = matplotlib.colorbar.make_axes(plt.gca()) 
cbar = matplotlib.colorbar.ColorbarBase(cax, cmap=color_map, norm=norm,) 

cbar.set_ticks([17,23,a]) 
cbar.set_ticklabels([17,23,a]) 

plt.show() 

enter image description here

+0

Ich mag diesen, aber (triviale Frage Warnung) möchte den rechten Seitenbereich loswerden. Aber ich denke, ich kann nicht, da es die "Grundlinie" ist, für die die korrekte Farbleiste erstellt wird. – FaCoffee

+0

Was meinst du mit "rechte Seite"? – ImportanceOfBeingErnest

1

Versuchen:

fig, ax = plt.subplots() 
cax = ax.imshow(mydata,interpolation='nearest',origin='lower') 
cbar = fig.colorbar(cax, ticks=[17,23,a]) 
cbar.ax.set_yticklabels(["add your label names"]) 

plt.show() 

siehe auch: http://matplotlib.org/examples/pylab_examples/colorbar_tick_labelling_demo.html

+0

Es wird erwartet funktioniert nicht wie ich. Es verlässt die Leiste genau so, wie Sie es im Beispiel sehen. – FaCoffee

+0

@ CF84 aktualisiert meine Antwort, macht es Sinn? –

+0

@ d.griner Ihre Lösung erfüllt die in Fettschrift geschriebene Anforderung in der Frage nicht. – ImportanceOfBeingErnest

Verwandte Themen