Przenoszenie osi X na górę wykresu w matplotlib

112

Opierając się na tym pytaniu o mapy cieplne w matplotlib , chciałem przenieść tytuły osi x na górę wykresu.

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

Jednak wywołanie funkcji set_label_position matplotlib (jak opisano powyżej) nie wydaje się przynosić pożądanego efektu. Oto mój wynik:

wprowadź opis obrazu tutaj

Co ja robię źle?

Jason Sundram
źródło

Odpowiedzi:

153

Posługiwać się

ax.xaxis.tick_top()

aby umieścić znaczniki na górze obrazu. Komenda

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

wpływa na etykietę, a nie na znaczniki.

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

wprowadź opis obrazu tutaj

unutbu
źródło
czy możesz mi powiedzieć, jak umieścić oś X między B i C? Próbowałem cały dzień, ale bez powodzenia
DaniPaniz
33

Chcesz set_ticks_positionzamiast set_label_position:

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

To daje mi:

wprowadź opis obrazu tutaj

Lev Levitsky
źródło
czy możesz mi powiedzieć, jak umieścić oś X między B i C? Próbowałem cały dzień, ale bez powodzenia
DaniPaniz
16

tick_params jest bardzo przydatne przy ustawianiu właściwości tick_params . Etykiety można przenosić na górę za pomocą:

    ax.tick_params(labelbottom=False,labeltop=True)
wSmit
źródło
Kwargi są wartościami logicznymi, więc powinny być Falsei Trueodpowiednio, w przeciwnym razie działa idealnie!
Milo Wielondek
1

Musisz wykonać dodatkowe masowanie, jeśli chcesz, aby kleszcze (nie etykiety) pojawiły się na górze i na dole (nie tylko na górze). Jedyny sposób, w jaki mogłem to zrobić, to niewielka zmiana w kodzie 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()

Wynik:

wprowadź opis obrazu tutaj

user1420304
źródło
czy możesz mi powiedzieć, jak umieścić oś X między B i C? Próbowałem cały dzień, ale bez powodzenia
DaniPaniz