如何降低 seaborn 中 x-ticks 的密度
How to decrease the density of x-ticks in seaborn
我有一些数据,我正试图根据这些数据在 seaborn 中构建一个计数图。所以我做了这样的事情:
data = np.hstack((np.random.normal(10, 5, 10000), np.random.normal(30, 8, 10000))).astype(int)
plot_ = sns.countplot(data)
并获取我的计数图:
问题是 x 轴上的刻度太密(这使它们无用)。我试图用 plot_.xticks=np.arange(0, 40, 10)
降低密度,但没有帮助。
还有没有办法用一种颜色制作情节?
报价频率
这里似乎有多个问题:
- 您在使用 plt.xticks 时使用了 = 运算符。您应该改用函数调用(但不是在这里;请先阅读第 2 点)!
- seaborn 的计数图 returns 一个轴对象,而不是图形
- 您需要使用更改 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 的例子都使用这个数据输入。
作为对已接受答案的轻微修改,我们通常 select 根据它们的值(而不是索引)进行标记,例如仅显示可被 10 整除的值,这可行:
for label in plot_.get_xticklabels():
if np.int(label.get_text()) % 10 == 0:
label.set_visible(True)
else:
label.set_visible(False)
因为你已经标记了 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])
尽管这已经在不久前得到了回答,但添加另一个可能更简单、更灵活的替代方案。
您可以使用 matplotlib axis tick locator 来控制显示哪些刻度。
在此示例中,您可以使用 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))
我有一些数据,我正试图根据这些数据在 seaborn 中构建一个计数图。所以我做了这样的事情:
data = np.hstack((np.random.normal(10, 5, 10000), np.random.normal(30, 8, 10000))).astype(int)
plot_ = sns.countplot(data)
并获取我的计数图:
问题是 x 轴上的刻度太密(这使它们无用)。我试图用 plot_.xticks=np.arange(0, 40, 10)
降低密度,但没有帮助。
还有没有办法用一种颜色制作情节?
报价频率
这里似乎有多个问题:
- 您在使用 plt.xticks 时使用了 = 运算符。您应该改用函数调用(但不是在这里;请先阅读第 2 点)!
- seaborn 的计数图 returns 一个轴对象,而不是图形
- 您需要使用更改 x 刻度的轴级方法(这不是
plt.xticks()
)
- 您需要使用更改 x 刻度的轴级方法(这不是
- seaborn 的计数图 returns 一个轴对象,而不是图形
试试这个:
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 的例子都使用这个数据输入。
作为对已接受答案的轻微修改,我们通常 select 根据它们的值(而不是索引)进行标记,例如仅显示可被 10 整除的值,这可行:
for label in plot_.get_xticklabels():
if np.int(label.get_text()) % 10 == 0:
label.set_visible(True)
else:
label.set_visible(False)
因为你已经标记了 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])
尽管这已经在不久前得到了回答,但添加另一个可能更简单、更灵活的替代方案。
您可以使用 matplotlib axis tick locator 来控制显示哪些刻度。
在此示例中,您可以使用 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))