2017-12-09 1 views
0

Im Moment sieht mein Code wie folgt aus:matplotlib Heatmap, anpassen y-Achse

#generate 262*20 elements 
values = np.random.random(262*20).tolist() 
# convert the list to a 2D NumPy array 
values = np.array(values).reshape((262, 20)) 
h, w = values.shape 
#h=262, w=20 
fig = plt.figure(num=None, dpi=80,figsize=(9, 7), facecolor='w', edgecolor='k') 
ax = fig.add_subplot(111) 
#fig, ax = plt.subplots() 
plt.imshow(values) 
plt.colorbar() 
plt.xticks(np.arange(w), list('PNIYLKCVFWABCDEFGHIJ')) 
ax.set_aspect(w/h) 
plt.show() 

Das Grundstück sieht wie folgt aus:

enter image description here

Wie Sie sehen können, ist der Bereich der y-Achse 0-261.

Aber ich möchte meine Y-Achse von 26 bis 290 gehen, fehlt 57, 239 und 253. Also immer noch 262 insgesamt. Ich habe versucht, eine Liste wie folgt zu erstellen:

mylist =[26, 27, ......missing 57, 239, 253, ....290] 
plt.yticks(np.arange(h), mylist) 

Die Y-Achse sieht einfach wie alles zusammengequetscht zusammen.

Also habe ich versucht:

pylab.ylim([26, 290]) 

und es sieht wie folgt aus:

enter image description here

es So fühlt sich genau wie die Daten in der ersten Reihe immer entspricht [0], nicht auf [ 26]

+0

Ich denke, dass Sie die Tick-Etiketten ändern müssen (siehe [hier] (https://matplotlib.org/api/_as_gen/ matplotlib.pyplot.xlabel.html? highlight = matplotlib% 20pyplot% 20xlabel # matplotlib.pyplot.xlabel)) und nicht die Ticks selbst. Die Ticks entsprechen den tatsächlichen Daten, und wenn Sie keine Daten aus dem Bereich 26-290 generieren, führt das einfache Ändern der Ticks nicht zum gewünschten Ergebnis. –

Antwort

1

Ich schlage vor, Sie verwenden pcolormesh. Wenn Sie Lücken benötigen, verwenden Sie ein Array numpy.ma.masked für den Bereich mit Lücken.

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

values = np.random.rand(290,20) 
values[:26, :] = np.NaN 
values[ [57, 239, 253], :] = np.NaN 
values = np.ma.masked_invalid(values) 

h, w = values.shape 
fig, ax = plt.subplots(figsize=(9,7)) 
# Make one larger so these values represent the edge of the data pixels. 
y = np.arange(0, 290.5) 
x = np.arange(0, 20.5) 

pcm = ax.pcolormesh(x, y, values, rasterized=True) # you don't need rasterized=True 
fig.colorbar(pcm) 
plt.xticks(np.arange(w), list('PNIYLKCVFWABCDEFGHIJ')) 
plt.show() 

Result

EDIT: Wenn Sie w/a 262x20 Array gerade arbeiten:

values = np.random.rand(262,20) 

h, w = values.shape 
fig, ax = plt.subplots(figsize=(9,7)) 
# Make one larger so these values represent the edge of the data pixels. 
y = np.arange(0, 290.5) 
y = np.delete(y, [57, 239, 253]) 
y = np.delete(y, range(26)) 

x = np.arange(0, 20.5) 

pcm = ax.pcolormesh(x, y, values, rasterized=True) # you don't need rasterized=True 
fig.colorbar(pcm) 
plt.xticks(np.arange(w), list('PNIYLKCVFWABCDEFGHIJ')) 

plt.show() 

Beachten Sie, dass dies nicht eine Leerzeile bei 57, 239 und 253 nicht setzen. Wenn Sie das wollen, müssen Sie tun:

values = np.random.rand(262,20) 
Z = np.ones((290, 20)) * np.NaN 
inds = set(range(290)) - set(list(range(26)) + [57, 239, 253]) 
for nn, ind in enumerate(inds): 
    Z[ind, :] = values[nn,:] 

h, w = values.shape 
fig, ax = plt.subplots(figsize=(9,7)) 
# Make one larger so these values represent the edge of the data pixels. 
y = np.arange(0, 290.5) 

x = np.arange(0, 20.5) 

pcm = ax.pcolormesh(x, y, Z, rasterized=True) # you don't need rasterized=True 
fig.colorbar(pcm) 
plt.xticks(np.arange(w), list('PNIYLKCVFWABCDEFGHIJ')) 

plt.show() 
+0

Was passiert, wenn die Werteliste nicht zufällig generiert wird? Sie stammen aus der Dateieingabe. values ​​= Lesen von einer Datei, dann umgestaltet in numpy array. – JY078

+0

Das Erstellen Ihres ersten Arrays ist eine andere Frage, und es ist ziemlich schwer zu erraten, in welchem ​​Anwendungsfall Sie das Format Ihrer Datei verstehen ... –

+0

Siehe oben. –

Verwandte Themen