Verschieben der x-Achse an den Anfang eines Diagramms in matplotlib

111

Basierend auf dieser Frage zu Heatmaps in matplotlib wollte ich die Titel der x-Achse an den oberen Rand des Diagramms verschieben.

import matplotlib.pyplot as plt
import numpy as np
column_labels = list('ABCD')
row_labels = list('WXYZ')
data = np.random.rand(4,4)
fig, ax = plt.subplots()
heatmap = ax.pcolor(data, cmap=plt.cm.Blues)

# put the major ticks at the middle of each cell
ax.set_xticks(np.arange(data.shape[0])+0.5, minor=False)
ax.set_yticks(np.arange(data.shape[1])+0.5, minor=False)

# want a more natural, table-like display
ax.invert_yaxis()
ax.xaxis.set_label_position('top') # <-- This doesn't work!

ax.set_xticklabels(row_labels, minor=False)
ax.set_yticklabels(column_labels, minor=False)
plt.show()

Das Aufrufen von set_label_position von matplotlib (wie oben angegeben) scheint jedoch nicht den gewünschten Effekt zu haben. Hier ist meine Ausgabe:

Geben Sie hier die Bildbeschreibung ein

Was mache ich falsch?

Jason Sundram
quelle

Antworten:

150

Verwenden

ax.xaxis.tick_top()

um die Häkchen oben im Bild zu platzieren. Der Befehl

ax.set_xlabel('X LABEL')    
ax.xaxis.set_label_position('top') 

wirkt sich auf das Etikett aus, nicht auf die Häkchen.

import matplotlib.pyplot as plt
import numpy as np
column_labels = list('ABCD')
row_labels = list('WXYZ')
data = np.random.rand(4, 4)
fig, ax = plt.subplots()
heatmap = ax.pcolor(data, cmap=plt.cm.Blues)

# put the major ticks at the middle of each cell
ax.set_xticks(np.arange(data.shape[1]) + 0.5, minor=False)
ax.set_yticks(np.arange(data.shape[0]) + 0.5, minor=False)

# want a more natural, table-like display
ax.invert_yaxis()
ax.xaxis.tick_top()

ax.set_xticklabels(column_labels, minor=False)
ax.set_yticklabels(row_labels, minor=False)
plt.show()

Geben Sie hier die Bildbeschreibung ein

unutbu
quelle
Kannst du mir bitte sagen, wie ich die X-Achse zwischen B und C setzen soll? Ich habe den ganzen Tag versucht, aber keinen Erfolg
DaniPaniz
33

Sie wollen set_ticks_positioneher als set_label_position:

ax.xaxis.set_ticks_position('top') # the rest is the same

Das gibt mir:

Geben Sie hier die Bildbeschreibung ein

Lev Levitsky
quelle
Kannst du mir bitte sagen, wie ich die X-Achse zwischen B und C setzen soll? Ich habe den ganzen Tag versucht, aber keinen Erfolg
DaniPaniz
16

tick_params ist sehr nützlich zum Festlegen von Tick-Eigenschaften. Beschriftungen können mit folgenden Elementen nach oben verschoben werden:

    ax.tick_params(labelbottom=False,labeltop=True)
wSmit
quelle
Kwargs sind Boolesche Werte, sollten es also sein Falseund Truefunktionieren ansonsten perfekt!
Milo Wielondek
1

Sie müssen extra massieren, wenn die Zecken (keine Beschriftungen) oben und unten (nicht nur oben) angezeigt werden sollen. Ich kann dies nur mit einer geringfügigen Änderung des Codes von unutbu tun:

import matplotlib.pyplot as plt
import numpy as np
column_labels = list('ABCD')
row_labels = list('WXYZ')
data = np.random.rand(4, 4)
fig, ax = plt.subplots()
heatmap = ax.pcolor(data, cmap=plt.cm.Blues)

# put the major ticks at the middle of each cell
ax.set_xticks(np.arange(data.shape[1]) + 0.5, minor=False)
ax.set_yticks(np.arange(data.shape[0]) + 0.5, minor=False)

# want a more natural, table-like display
ax.invert_yaxis()
ax.xaxis.tick_top()
ax.xaxis.set_ticks_position('both') # THIS IS THE ONLY CHANGE

ax.set_xticklabels(column_labels, minor=False)
ax.set_yticklabels(row_labels, minor=False)
plt.show()

Ausgabe:

Geben Sie hier die Bildbeschreibung ein

user1420304
quelle
Kannst du mir bitte sagen, wie ich die X-Achse zwischen B und C setzen soll? Ich habe den ganzen Tag versucht, aber keinen Erfolg
DaniPaniz