Movendo o eixo x para o topo de um gráfico em matplotlib

111

Com base nesta pergunta sobre mapas de calor em matplotlib , eu queria mover os títulos do eixo x para o topo do gráfico.

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

No entanto, chamar set_label_position de matplotlib (conforme notado acima) não parece ter o efeito desejado. Aqui está minha saída:

insira a descrição da imagem aqui

O que estou fazendo de errado?

Jason Sundram
fonte

Respostas:

152

Usar

ax.xaxis.tick_top()

para colocar as marcas de verificação no topo da imagem. O comando

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

afeta o rótulo, não as marcas de escala.

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

insira a descrição da imagem aqui

unutbu
fonte
você pode me dizer como colocar o eixo X entre B e C? Tentei o dia todo, mas sem sucesso
DaniPaniz
33

Você quer em set_ticks_positionvez de set_label_position:

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

Isso me dá:

insira a descrição da imagem aqui

Lev Levitsky
fonte
você pode me dizer como colocar o eixo X entre B e C? Tentei o dia todo, mas sem sucesso
DaniPaniz
16

tick_params é muito útil para definir propriedades de tick. As etiquetas podem ser movidas para o topo com:

    ax.tick_params(labelbottom=False,labeltop=True)
wSmit
fonte
Kwargs são booleanos, então deveriam ser Falsee Truerespectivamente, caso contrário, funciona perfeitamente!
Milo Wielondek
1

Você precisa fazer uma massagem extra se quiser que os carrapatos (não os rótulos) apareçam na parte superior e inferior (não apenas na parte superior). A única maneira de fazer isso é com uma pequena alteração no código do 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()

Resultado:

insira a descrição da imagem aqui

user1420304
fonte
você pode me dizer como colocar o eixo X entre B e C? Tentei o dia todo, mas sem sucesso
DaniPaniz