Python 如何将共享的x标签和y标签添加到使用pandas';情节

Python 如何将共享的x标签和y标签添加到使用pandas';情节,python,pandas,matplotlib,Python,Pandas,Matplotlib,现在如何将x和y标签添加到生成的绘图中?它被解释为一个单一的情节。因此,如果我想向特定子批次添加标签,我可以: ax[1][0].set_xlabel('my_general_xlabel') ax[0][0].set_ylabel('my_general_ylabel') plt.show() 这就产生了: 如何添加标签,使其居中,而不只是指一行/一列?这将创建一个不可见的111轴,您可以在其中设置常规x和y标签: import pandas as pd import matplotlib

现在如何将x和y标签添加到生成的绘图中?它被解释为一个单一的情节。因此,如果我想向特定子批次添加标签,我可以:

ax[1][0].set_xlabel('my_general_xlabel')
ax[0][0].set_ylabel('my_general_ylabel')
plt.show()
这就产生了:


如何添加标签,使其居中,而不只是指一行/一列?

这将创建一个不可见的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})

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

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

新增:最新matplotlib(v3.4+;使用
pip——升级matplotlib
)还具有图形级别x和y标签:

fig.supxlabel('my general x-label')
fig.supylabel('my general y-label')
虽然这是一个需要了解的重要选项,但默认情况下,它与匹配字体大小和位置并不完全相同,就好像它适合某个子批次一样。见文件:
看到它有很多选项来满足原始问题的要求。

不完全是我想要的:我希望两个图都有一个单独的xlabel,集中在两个图之间;y轴也是,我明白了。您需要类似于
suptitle
的东西,这对您没有任何帮助,即放置一个一般居中的标题,而不是x和y标签。我正在做一些可能对你有帮助的事情:添加111子图。这与@sparkandshine发布的内容类似。与此不同的是,此解决方案使用已生成的图形,但需要微调LabelPad。我刚刚更新了解决方案末尾的代码,以修改单个标题的fontsizeWas,这不是原始问题的一部分,但您是否看到更改单个子批次标题fontsize的方法(在这种情况下,
A
B
C
D
)?@Cleb,您可以使用参数
labelpad
调整标签的位置,请检查我编辑的答案。我指的是子批次上方的字母(也出现在图例中的字母)。不是原始问题的一部分,但您是否看到了更改单个子地块标题字体大小的方法(在本例中,
a
B
C
D
)?@Cleb:它们需要不同的大小吗?如果不需要,最简单的方法是使用
plt.rcParams[“axes.titlesize”]=20
位于脚本顶部(这将为所有标题将fontsize设置为20)。
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()
fig.supxlabel('my general x-label')
fig.supylabel('my general y-label')