对于使用col_wrap的seaborn catplot创建的绘图,为所有栅格设置Xticklabel

2024-06-01 07:44:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用以下方法创建了一个绘图:

g = sns.catplot(x='loja', y='preco', col='Descr. Grupo', col_wrap=3, capsize=.2, height=4, aspect=1.2,
            kind='point', sharey=False, data=df_long)

此图构建了10个网格,但只有最后3个网格具有我想要的xticklabels
我们可以这样看:

for ax in g.axes:
    print(ax.get_xticklabels())   
<a list of 0 Text major ticklabel objects>
<a list of 0 Text major ticklabel objects>
<a list of 0 Text major ticklabel objects>
<a list of 0 Text major ticklabel objects>
<a list of 0 Text major ticklabel objects>
<a list of 0 Text major ticklabel objects>
<a list of 0 Text major ticklabel objects>
<a list of 3 Text major ticklabel objects>
<a list of 3 Text major ticklabel objects>
<a list of 3 Text major ticklabel objects>

由于列loja有3个不同的类别,我希望每个网格有3 xticklabels

所以我试着这样做:

for ax in g.axes:
    ax.set_xticklabels(['a', 'b', 'c'], visible=True, rotation=0)

现在xticklabels被创建了,但是有一个意想不到的行为:标签也出现在每个网格的顶部

如何仅保留每个网格底部的xticklabels


Tags: of方法textin网格forobjectscol
1条回答
网友
1楼 · 发布于 2024-06-01 07:44:33

设置ax.tick_params(labelbottom=True)似乎可以解决这个问题。可能需要plt.subplots_adjust(...)加宽一些填充物

import seaborn as sns
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df_long = pd.DataFrame({'loja': np.random.randint(1, 4, 200),
                        'preco': np.random.randn(200).cumsum() + 100,
                        'Descr. Grupo': np.random.randint(1, 6, 200)})
g = sns.catplot(x='loja', y='preco', col='Descr. Grupo', col_wrap=3, capsize=.2, height=3, aspect=1.2,
                kind='point', sharey=False, data=df_long)
for ax in g.axes:
    ax.set_xticklabels(['A', 'B', 'C'], rotation=0)
    ax.tick_params(labelbottom=True)
plt.subplots_adjust(bottom=0.1, left=0.06, hspace=0.2)
plt.show()

example plot

相关问题 更多 >