如何将共享的x-label和y-label添加到用pandas的情节创建的图中?

Cle*_*leb 12 python matplotlib pandas

可以使用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)
Run Code Online (Sandbox Code Playgroud)

现在如何将x和y标签添加到结果图中?这里解释了一个单一的情节.因此,如果我想为特定的子图添加标签,我可以这样做:

ax[1][0].set_xlabel('my_general_xlabel')
ax[0][0].set_ylabel('my_general_ylabel')
plt.show()
Run Code Online (Sandbox Code Playgroud)

这给了:

在此输入图像描述

如何添加标签以使它们居中并且不仅仅引用一行/列?

Imp*_*est 15

X和y标签绑定到matplotlib中的轴.因此,为了标记多个子图,使用xlabelylabel命令是没有意义的.

但是,可以创建一个简单的文本并将其放在所需的位置.fig.text(x,y, text)地方一些文字的坐标xy图坐标,也就是图的左下角有坐标(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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这种解决方案的缺点是需要手动设置文本放置位置的坐标,并且可能取决于图形大小.

  • @Cleb:它们需要有不同的尺寸吗?如果没有,最简单的方法是在脚本顶部使用`plt.rcParams["axes.titlesize"] = 20`(这会将所有标题的字体大小设置为20)。 (2认同)

CPB*_*PBL 10

新功能:最近的 matplotlib (v3.4+; use pip --upgrade matplotlib) 也有图形级别的 x 和 y 标签:

fig.supxlabel('my general x-label')
fig.supylabel('my general y-label')
Run Code Online (Sandbox Code Playgroud)

虽然这是一个需要了解的重要选项,但默认情况下,它与字体大小和位置匹配(就好像它适合子图之一一样)并不完全相同。请参阅文档: https: //matplotlib.org/devdocs/api/figure_api.html#matplotlib.figure.FigureBase.supxlabel 以查看它带有大量选项来满足原始问题的要求。


Spa*_*ine 9

另一种解决方案:创建一个大的子图,然后设置公共标签.这就是我得到的.

在此输入图像描述

源代码如下.

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()
Run Code Online (Sandbox Code Playgroud)


Pab*_*yes 6

这将创建一个不可见的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})
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 更新。它与 @sparkandshine 也发布的内容类似。不同之处在于该解决方案使用已经生成的图形,但需要微调标签板。 (2认同)
  • 我刚刚更新了解决方案末尾的代码来修改单个标题的字体大小 (2认同)