Seaborn:Violinplot遇到太多变量的困难吗?

时间:2019-05-28 21:56:37

标签: python pandas matplotlib data-visualization seaborn

我想用seaborn用小提琴来可视化我的整个熊猫数据框,并且我想我已经进行了必要的更正,以生成一个大图形显示我的数据框拥有的270个变量。

但是,无论我做什么,小提琴图只显示每个变量的内部迷你盒形图(如另一个问题here所述),而不显示其kde:

fig, ax = plt.subplots(figsize=(50,5))
ax.set_ylim(-6, 6)

a = sns.violinplot(x='variable', y='value', data=pd.melt(train_norm), ax=ax)
a.set_xticklabels(a.get_xticklabels(), rotation=90);

plt.savefig('massive_violinplot.png', figsize=(50,5), dpi=220)

enter image description here

(对裁剪后的图表示歉意,整个内容太大而无法发布)

以下代码,使用相同的pd.Dataframe,但仅显示前六个变量,可以正确显示:

fig, ax = plt.subplots(figsize=(10,5))
ax.set_ylim(-6, 6)

a = sns.violinplot(x='variable', y='value', data=pd.melt(train_norm.iloc[:,:6]), ax=ax)
a.set_xticklabels(a.get_xticklabels(), rotation=90);

plt.savefig('massive_violinplot.png', figsize=(10,5), dpi=220)

enter image description here

我如何获得所有变量的上述图形,并用适当的小提琴图显示其kde?

任何对此的经验丰富的建议将不胜感激。

编辑: 我用来创建数据的csv文件的链接在此处,yourfilelink.com / get.php?fid = 2025783

1 个答案:

答案 0 :(得分:1)

这与变量的数量或图的大小无关,而与变量分布的巨大差异有关。我现在无法访问您的数据,因此我将使用一个组合的数据集对其进行说明。您可以跟着数据集进行操作,选择离散度较高的三个变量和离散度较小的三个变量。作为离散度测量,您可以使用方差,甚至可以使用数据范围(如果您没有疯狂的长尾巴)或其他一些东西,我不确定哪种方法会更好。

rs = np.random.RandomState(42)
data = rs.randn(100, 6)
data[:, :3] *= 20
df = pd.DataFrame(data)

看看如果我们用公共轴绘制密度,以便它们可以直接比较,会发生什么情况。

df.plot(kind='kde', subplots=True, layout=(3, 2), sharex=True, sharey=True)
plt.tight_layout()

Density with common axes

这几乎与您在海上小提琴情节中看到的相同,但当然是转置的。

sns.violinplot(x='variable', y='value', data=pd.melt(df))

Default seaborn violin plot

这通常对于比较变量非常有用,因为您可以将宽度的差异视为密度的差异。不幸的是,用于分散度更高的变量的小提琴是如此狭窄,以至于您根本看不到宽度,并且您对形状失去任何感觉。另一方面,离散度较小的变量显得太短(实际上,在您的数据集中,其中一些只是水平线)。

对于第一个问题,您可以通过使用scale='width'使小提琴使用所有可用的水平空间,但随后您将无法再比较各个变量的密度。峰的宽度相同,但密度不同。

sns.violinplot(x='variable', y='value', data=pd.melt(df), scale='width')

Seaborn violin plot with scale='width'

顺便说一下,这是matplotlib的小提琴图默认情况下所做的。

plt.violinplot(df.T)

Matplotlib default violin plot.

对于第二个问题,我认为您唯一的选择是以某种方式标准化或标准化变量。

sns.violinplot(x='variable', y='value', data=pd.melt((df - df.mean()) / df.std()))

Standardized violin plot

现在您可以分别更清晰地查看每个变量的视图(它们有多少种模式,它们有多倾斜,尾巴有多长...),但是您既不能比较比例,也不能比较变量之间的离散度。

这个故事的寓意是,您无法一次看到所有内容,必须根据数据中的查找内容进行选择。