如何在seaborn中减少x轴刻度的密度

35

我有一些数据,基于这些数据我正在尝试在seaborn中构建一个计数图。因此我做了以下操作:

data = np.hstack((np.random.normal(10, 5, 10000), np.random.normal(30, 8, 10000))).astype(int)
plot_ = sns.countplot(data)

并获得我的计数图:

enter image description here

问题在于x轴上的刻度太密集(使它们变得无用)。我尝试使用plot_.xticks=np.arange(0, 40, 10)来减少密度,但这并没有帮助。

还有一种方法可以让图表只有一种颜色吗?


2
不要在此应用程序中使用 countplot。请使用例如 distplot 或仅使用 plt.hist - mwaskom
您可以增加图表的“figsize”以填充整个窗口。然后,您可以避免xticks过于拥挤。为保持“countplot”中相同的颜色,您可以执行sns.countplot(data, color='r', saturation=1) - Nickil Maveli
4个回答

35

刻度频率

这里似乎有多个问题:

    1. 在使用plt.xticks时使用了等号运算符。您应该改用函数调用而不是等号(但是先阅读第二点!)
    1. seaborn的countplot返回一个轴对象,而不是一个图像
      • 您需要使用轴级别方法来更改x轴刻度(即不是plt.xticks()

尝试这个:

for ind, label in enumerate(plot_.get_xticklabels()):
    if ind % 10 == 0:  # every 10th label is kept
        label.set_visible(True)
    else:
        label.set_visible(False)

颜色

我认为对于这种类型的图表,数据设置不是最优的。Seaborn将把每个唯一值解释为新类别并引入一种新颜色。如果我没错的话,颜色/和x-ticks的数量等于np.unique(data)的数量。

将你的数据与seaborn的示例进行比较(它们都是基于可以导入检查的数据)。

我还认为使用pandas数据框架(而不是numpy数组)更容易使用seaborn(我经常以错误的方式准备我的数据,并且子集选择需要预处理;数据框架提供更多)。我认为seaborn的大多数示例使用此数据输入。


1
如何解决jointplot的'JointGrid' object has no attribute 'get_xticklabels'问题? - mikelowry

12

虽然这个问题已经在一段时间之前得到了回答,但是我想再添加一个更加灵活且更简单的替代方案。

你可以使用一个Matplotlib轴刻度定位器来控制显示哪些刻度。

在这个示例中,你可以使用LinearLocator来实现同样的效果:

import pandas as pd
import seaborn as sns
import numpy as np
import matplotlib.ticker as ticker

data  = np.hstack((np.random.normal(10, 5, 10000), np.random.normal(30, 8, 10000))).astype(int)
plot_ = sns.countplot(data)
plot_.xaxis.set_major_locator(ticker.LinearLocator(10))

8

既然您已经标记了matplotlib,与将刻度线设置为可见的 True/False 不同的一种解决方案是按照以下方式绘制每个第n个标签

fig = plt.figure(); np.random.seed(123)

data = np.hstack((np.random.normal(10, 5, 10000), np.random.normal(30, 8, 10000))).astype(int)
plot_ = sns.countplot(data)

fig.canvas.draw()
new_ticks = [i.get_text() for i in plot_.get_xticklabels()]
plt.xticks(range(0, len(new_ticks), 10), new_ticks[::10])

enter image description here


7
作为对被接受答案的轻微修改,我们通常根据标签的值(而不是索引)进行选择,例如,要仅显示可被10整除的值,可以使用以下方法:
for label in plot_.get_xticklabels():
    if np.int(label.get_text()) % 10 == 0:  
        label.set_visible(True)
    else:
        label.set_visible(False)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接