如何防止 sns.countplot 中的 x 轴标签重叠

Posted

技术标签:

【中文标题】如何防止 sns.countplot 中的 x 轴标签重叠【英文标题】:How to prevent overlapping x-axis labels in sns.countplot 【发布时间】:2017-07-20 14:45:05 【问题描述】:

为了剧情

sns.countplot(x="HostRamSize",data=df)

我得到下图与 x 轴标签混合在一起,我该如何避免这种情况?我应该改变图表的大小来解决这个问题吗?

【问题讨论】:

你能添加一个df的例子吗? (没有投反对票)。你能不只是转动xlabel吗? 这个问题很差,原始数据在哪里,重新创建df的代码 @EdChum 我只是觉得有一些方法可以在不查看细节的情况下放大图表? @Cleb 也许假设不能更改 xlabel。 也许this 有帮助?! 【参考方案1】:

有一个这样的系列ds

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np; np.random.seed(136)

l = "1234567890123"
categories = [ l[i:i+5]+" - "+l[i+1:i+6] for i in range(6)]
x = np.random.choice(categories, size=1000, 
            p=np.diff(np.array([0,0.7,2.8,6.5,8.5,9.3,10])/10.))
ds = pd.Series("Column" : x)

有几个选项可以使轴标签更具可读性。

改变图形大小

plt.figure(figsize=(8,4)) # this creates a figure 8 inch wide, 4 inch high
sns.countplot(x="Column", data=ds)
plt.show()

旋转刻度标签

ax = sns.countplot(x="Column", data=ds)

ax.set_xticklabels(ax.get_xticklabels(), rotation=40, ha="right")
plt.tight_layout()
plt.show()

减小字体大小

ax = sns.countplot(x="Column", data=ds)

ax.set_xticklabels(ax.get_xticklabels(), fontsize=7)
plt.tight_layout()
plt.show()

当然,这些的任何组合都同样有效。

设置 rcParams

图形大小和xlabel字体大小可以使用rcParams全局设置

plt.rcParams["figure.figsize"] = (8, 4)
plt.rcParams["xtick.labelsize"] = 7

这可能有助于放在 juypter 笔记本上,以便这些设置适用于其中生成的任何图形。不幸的是,使用 rcParams 无法旋转 xticklabels。

我想值得注意的是,同样的策略自然也适用于 seaborn barplot、matplotlib bar plot 或 pandas.bar。

【讨论】:

AttributeError: 'FacetGrid' object has no attribute 'get_xticklabels' 尝试旋转刻度标签时。 @AnnaVopureta 我没有声称这适用于 FacetGrid。它适用于任何返回轴的 seaborn 函数。 当我将它用于以下返回轴的 seaborn 函数时失败:ax = sns.catplot(y="Dataset", x="Size (bytes)", hue="Implementation", data=pdData, height=6, kind="bar", palette="muted", legend=False) 我知道。因为 catplot 返回的是 FacetGrid,而不是轴。 我没有意识到这一点,我的错。如何解决 catplot(和其他返回 FacetGrid 的函数)的重叠轴标签问题?【参考方案2】:

如果你只是想确保 xticks 标签不被挤在一起,你可以设置一个合适的 fig 大小并尝试fig.autofmt_xdate()

此功能会自动对齐和旋转标签。

【讨论】:

【参考方案3】:

您可以使用pandas.pyplotxticks 方法旋转x_labels 并增加其字体大小。

例如:

import matplotlib.pyplot as plt
plt.figure(figsize=(10,5))
chart = sns.countplot(x="HostRamSize",data=df)

plt.xticks(
    rotation=45, 
    horizontalalignment='right',
    fontweight='light',
    fontsize='x-large'  
)

更多这样的修改,你可以参考这个链接: Drawing from Data

【讨论】:

你是个天才!这是我见过的最好的答案, 依赖于ax.set_xticklabels(ax.get_xticklabels(), fontsize=7) 方法。谢谢!【参考方案4】:
plt.figure(figsize=(15,10)) #adjust the size of plot
ax=sns.countplot(x=df['Location'],data=df,hue='label',palette='mako')

ax.set_xticklabels(ax.get_xticklabels(), rotation=40, ha="right")  #it will rotate text on x axis

plt.tight_layout()
plt.show()

您可以尝试此代码并根据需要更改大小和旋转。

【讨论】:

请不要发布仅代码的答案。对于未来的读者来说,看到解释为什么这会回答这个问题会更有趣。带有解释的答案往往更容易被接受。【参考方案5】:

我不知道这是否适合您,但也许转动图形可能是一种解决方案(而不是在x= 上绘制,而是在y= 上绘制),这样:

sns.countplot(y="HostRamSize",data=df)

【讨论】:

以上是关于如何防止 sns.countplot 中的 x 轴标签重叠的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 seaborn countplot 中图例的位置?

获取相应x刻度标签的正确值计数[重复]

如何在seaborn的条形顶部添加百分比

如何在seaborn的条形顶部添加百分比

如何防止 Nivo 刻度轴文本中的文本截断(条形图)

10.2 sns 绘图