Sal*_*ali 10 python matplotlib seaborn
我有一些数据,基于此我试图在seaborn中建立一个计数图.所以我这样做:
data = np.hstack((np.random.normal(10, 5, 10000), np.random.normal(30, 8, 10000))).astype(int)
plot_ = sns.countplot(data)
Run Code Online (Sandbox Code Playgroud)
得到我的计数图:
问题是x轴上的刻度太密集(这使得它们无用).我试图降低密度,plot_.xticks=np.arange(0, 40, 10)但没有帮助.
还有一种方法可以用一种颜色制作情节吗?
sas*_*cha 10
这里似乎有多个问题:
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)
Run Code Online (Sandbox Code Playgroud)
我认为对于这种类型的绘图,数据设置并不是最佳选择.Seaborn将每个独特的价值解释为新的类别并引入新的颜色.如果我是对的,颜色/和x-ticks的数量等于np.unique(数据)的数量.
将您的数据与seaborn的示例进行比较(这些示例均基于可导入以检查的数据).
我也认为使用seaborn更容易使用pandas数据帧(而不是numpy数组;我经常以错误的方式准备我的数据,子集选择需要预处理;数据帧提供更多).我认为seaborn的大多数例子都使用这种数据输入.
作为对已接受答案的轻微修改,我们通常根据标签的值(而不是索引)选择标签,例如仅显示可被 10 整除的值,这将起作用:
for label in plot_.get_xticklabels():
if np.int(label.get_text()) % 10 == 0:
label.set_visible(True)
else:
label.set_visible(False)
Run Code Online (Sandbox Code Playgroud)
由于您已标记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])
Run Code Online (Sandbox Code Playgroud)
尽管这已经在不久前得到了回答,但添加了另一个可能更简单的更灵活的替代方案。
您可以使用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))
Run Code Online (Sandbox Code Playgroud)