首页 > 解决方案 > 如何通过 Seaborn 和 Matplotlib 让 x 轴标题出现在 Python 中 relplot 的所有子图中?

问题描述

我无法在 relplot 中为我的一个子图显示 x 轴标题。我有三个图表,我做了列,我做了 col_wrap=2 所以我有两个图表在顶部,一个在底部。第一行的第二个图和第二行的图都有 x 轴标题,但第一行的第一个图没有。我得到了刻度和它们的标签,它出现在 for 循环中,但没有出现在 x 轴标题中。

g = sns.relplot(
    data=data, x="Days", y="Response", col = 'Event', 
col_wrap=2
)

g.set_titles("Events in {col_name}")
g.set_axis_labels("Days", "Response")
for ax in g.axes:
    ax.xaxis.set_tick_params(labelbottom=True)

标签: pythonseaborn

解决方案


g.set_axis_labels(...)只设置外部标签(docs,几乎在最后)。

默认情况下,使用共享 x 轴,只有“外部”xlabels 设置为可见,内部 xlabels 设置为不可见(并且 seaborn 将它们保留为空字符串)。因此,要查看所有标签,您需要明确设置字符串和可见性。

最后,您可能需要调用plt.tight_layout()以删除重叠。

请注意,一遍又一遍地重复所有标签会占用屏幕空间,而不会向绘图添加真实信息。

from matplotlib import pyplot as plt
import seaborn as sns

penguins = sns.load_dataset('penguins')
g = sns.relplot(data=penguins, x='flipper_length_mm', y='body_mass_g', col='species', col_wrap=2,
                height=2, aspect=2)
# g.set_axis_labels("Flipper length", "Body mass")  # only sets the outer labels
for ax in g.axes:
    ax.tick_params(labelbottom=True, labelleft=True)
    ax.set_xlabel("Flipper length", visible=True)
    ax.set_ylabel("Body mass", visible=True)
plt.tight_layout()
plt.show()

sns.relplot 带有额外的 x 和 y 标签


推荐阅读