Déplacement de l'axe des x vers le haut d'un graphique dans matplotlib

111

Sur la base de cette question sur les cartes thermiques dans matplotlib , je voulais déplacer les titres de l'axe des x vers le haut du graphique.

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()

Cependant, l'appel de set_label_position de matplotlib (comme indiqué ci-dessus) ne semble pas avoir l'effet souhaité. Voici ma sortie:

entrez la description de l'image ici

Qu'est-ce que je fais mal?

Jason Sundram
la source

Réponses:

152

Utilisation

ax.xaxis.tick_top()

pour placer les graduations en haut de l'image. La commande

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

affecte l'étiquette, pas les graduations.

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()

entrez la description de l'image ici

unutbu
la source
pouvez-vous s'il vous plaît me dire comment mettre l'axe X entre B et C? J'ai essayé toute la journée mais sans succès
DaniPaniz
33

Vous voulez set_ticks_positionplutôt que set_label_position:

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

Cela me donne:

entrez la description de l'image ici

Lev Levitsky
la source
pouvez-vous s'il vous plaît me dire comment mettre l'axe X entre B et C? J'ai essayé toute la journée mais sans succès
DaniPaniz
16

tick_params est très utile pour définir les propriétés des ticks . Les étiquettes peuvent être déplacées vers le haut avec:

    ax.tick_params(labelbottom=False,labeltop=True)
wSmit
la source
Les kwargs sont des booléens donc devraient être Falseet Truerespectivement, sinon fonctionne parfaitement!
Milo Wielondek
1

Vous devez faire un massage supplémentaire si vous voulez que les tiques (pas les étiquettes) apparaissent en haut et en bas (pas seulement en haut). La seule façon dont je pourrais faire cela est avec une modification mineure du code d'unutbu:

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()

Production:

entrez la description de l'image ici

user1420304
la source
pouvez-vous s'il vous plaît me dire comment mettre l'axe X entre B et C? J'ai essayé toute la journée mais sans succès
DaniPaniz