Как добавить общую метку x и ярлык y к сюжету, созданному с помощью pandas 'plot?
С помощью pandas:
можно легко создавать подзаголовки из фреймворка данных.
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({'A': [0.3, 0.2, 0.5, 0.2], 'B': [0.1, 0.0, 0.3, 0.1], 'C': [0.2, 0.5, 0.0, 0.7], 'D': [0.6, 0.3, 0.4, 0.6]}, index=list('abcd'))
ax = df.plot(kind="bar", subplots=True, layout=(2, 2), sharey=True, sharex=True, rot=0, fontsize=20)
Как теперь добавить x- и y-метки в итоговый график? Здесь объясняется для одного сюжета. Поэтому, если бы я хотел добавить метки к определенному подзаголовку, я мог бы сделать:
ax[1][0].set_xlabel('my_general_xlabel')
ax[0][0].set_ylabel('my_general_ylabel')
plt.show()
Это дает:
![введите описание изображения здесь]()
Как добавить ярлыки так, чтобы они были центрированы и не просто ссылались на одну строку/столбец?
Ответы
Ответ 1
X и y метки привязаны к осям в matplotlib. Поэтому нет смысла использовать команды xlabel
или ylabel
для обозначения нескольких подзаговоров.
Однако возможно создать простой текст и поместить его в нужную позицию. fig.text(x,y, text)
помещает некоторый текст в координатах x
и y
в координатах фигур, т.е. в левом нижнем углу рисунка находятся координаты (0,0)
верхний правый (1,1)
.
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({'A': [0.3, 0.2, 0.5, 0.2], 'B': [0.1, 0.0, 0.3, 0.1], 'C': [0.2, 0.5, 0.0, 0.7], 'D': [0.6, 0.3, 0.4, 0.6]}, index=list('abcd'))
axes = df.plot(kind="bar", subplots=True, layout=(2,2), sharey=True, sharex=True)
fig=axes[0,0].figure
fig.text(0.5,0.04, "Some very long and even longer xlabel", ha="center", va="center")
fig.text(0.05,0.5, "Some quite extensive ylabel", ha="center", va="center", rotation=90)
plt.show()
![введите описание изображения здесь]()
Недостатком этого решения является то, что координаты места размещения текста должны быть установлены вручную и могут зависеть от размера фигуры.
Ответ 2
Другое решение: создайте большой подзаговор, а затем установите общие метки. Вот что я получил.
![введите описание изображения здесь]()
Исходный код ниже.
import pandas as pd
import matplotlib.pyplot as plt
fig = plt.figure()
axarr = fig.add_subplot(221)
df = pd.DataFrame({'A': [0.3, 0.2, 0.5, 0.2], 'B': [0.1, 0.0, 0.3, 0.1], 'C': [0.2, 0.5, 0.0, 0.7], 'D': [0.6, 0.3, 0.4, 0.6]}, index=list('abcd'))
axes = df.plot(kind="bar", ax=axarr, subplots=True, layout=(2, 2), sharey=True, sharex=True, rot=0, fontsize=20)
# Create a big subplot
ax = fig.add_subplot(111, frameon=False)
# hide tick and tick label of the big axes
plt.tick_params(labelcolor='none', top='off', bottom='off', left='off', right='off')
ax.set_xlabel('my_general_xlabel', labelpad=10) # Use argument `labelpad` to move label downwards.
ax.set_ylabel('my_general_ylabel', labelpad=20)
plt.show()
Ответ 3
Это создаст невидимую ось 111, где вы можете установить общие метки x и y:
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({'A': [0.3, 0.2, 0.5, 0.2], 'B': [0.1, 0.0, 0.3, 0.1],
'C': [0.2, 0.5, 0.0, 0.7], 'D': [0.6, 0.3, 0.4, 0.6]},
index=list('abcd'))
ax = df.plot(kind="bar", subplots=True, layout=(2, 2), sharey=True,
sharex=True, rot=0, fontsize=12)
fig = ax[0][0].get_figure() # getting the figure
ax0 = fig.add_subplot(111, frame_on=False) # creating a single axes
ax0.set_xticks([])
ax0.set_yticks([])
ax0.set_xlabel('my_general_xlabel', labelpad=25)
ax0.set_ylabel('my_general_ylabel', labelpad=45)
# Part of a follow up question: Modifying the fontsize of the titles:
for i,axi in np.ndenumerate(ax):
axi.set_title(axi.get_title(),{'size' : 16})
![введите описание изображения здесь]()