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

Python Seaborn:Violinplot遇到太多变量的困难?,python,pandas,matplotlib,data-visualization,seaborn,Python,Pandas,Matplotlib,Data Visualization,Seaborn,我想用seaborn用violinplots来可视化我的整个Pandas数据框,我想我已经做了必要的修改,为我的数据框拥有的270个变量生成了一个大型图表 但是,无论我怎么做,ViolinProots只显示每个变量的内部迷你箱线图(如另一个问题所述),而不是kde: fig, ax = plt.subplots(figsize=(50,5)) ax.set_ylim(-6, 6) a = sns.violinplot(x='variable', y='value', data=pd.melt(

我想用seaborn用violinplots来可视化我的整个Pandas数据框,我想我已经做了必要的修改,为我的数据框拥有的270个变量生成了一个大型图表

但是,无论我怎么做,ViolinProots只显示每个变量的内部迷你箱线图(如另一个问题所述),而不是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)

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

而以下代码使用相同的
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)


我怎样才能得到一个像上面这样的所有变量的图表,用适当的ViolinProot来显示它们的kde

这与变量数量或绘图大小无关,而是与变量分布的巨大差异有关。我现在无法访问您的数据,因此我将使用一个虚构的数据集对其进行演示。您可以跟随数据集,选择三个离散度较大的变量和三个离散度较小的变量。作为一个离散度度量,你可以使用方差,甚至是数据范围(如果你没有疯狂的长尾巴)或其他不同的东西,我不确定什么更好

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()

这或多或少是相同的,你可以看到在海伯恩小提琴情节,但当然转置

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

这通常是比较变量的好方法,因为可以将宽度的差异视为密度的差异。不幸的是,色散较大的变量的小提琴太窄了,以至于你根本看不到宽度,也就失去了形状感。另一方面,分散度较小的变量显得太短(实际上,在数据集中,有些变量只是水平线)

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

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

顺便说一句,这是matplotlib的小提琴绘图在默认情况下的功能

plt.violinplot(df.T)

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

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

现在你对每个变量都有了更清晰的了解(它们有多少个模式,它们有多歪斜,尾巴有多长…),但是你既不能比较变量之间的尺度也不能比较变量之间的分散度


这个故事的寓意是,你不能一下子看到所有的东西,你必须根据你在数据中寻找的东西进行挑选。

这与变量的数量或绘图大小无关,而是与变量分布的巨大差异有关。我现在无法访问您的数据,因此我将使用一个虚构的数据集对其进行演示。您可以跟随数据集,选择三个离散度较大的变量和三个离散度较小的变量。作为一个离散度度量,你可以使用方差,甚至是数据范围(如果你没有疯狂的长尾巴)或其他不同的东西,我不确定什么更好

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()

这或多或少是相同的,你可以看到在海伯恩小提琴情节,但当然转置

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

这通常是比较变量的好方法,因为可以将宽度的差异视为密度的差异。不幸的是,色散较大的变量的小提琴太窄了,以至于你根本看不到宽度,也就失去了形状感。另一方面,分散度较小的变量显得太短(实际上,在数据集中,有些变量只是水平线)

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

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

顺便说一句,这是matplotlib的小提琴绘图在默认情况下的功能

plt.violinplot(df.T)

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

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

现在你对每个变量都有了更清晰的了解(它们有多少个模式,它们有多歪斜,尾巴有多长…),但是你既不能比较变量之间的尺度也不能比较变量之间的分散度


这个故事的寓意是,你不能一下子看到所有的东西,你必须根据你在数据中寻找的东西进行挑选。

如果你试图在一个图形上画太多的图,a)你得到了你描述的问题,b)它不再是数据可视化的有用工具。一种选择是将要直接比较的特征分组,并将每组显示在不同的子地块上。另一种方法是只显示一些特性,这些特性告诉我们一些关于数据的有用信息,而放弃其他特性。除此之外,唯一的另一个选择是拥有一个巨大的绘图区域,但这不是一个好主意,因为有这么多原因。我理解将一个任务分成不同的块的价值,但在我拥有的利基数据处理上下文中,最好一次查看所有变量,而且必须有一种方法来做到这一点。例如,正如在我的浏览器中看到的,处理如此大的图形是完全可行的,而且seaborn似乎有足够的空间生成真正的violinplots。然而,当我不断扩展图的
figsize
时,最终它开始分解,如图所示,您可以将其分解为块,使图像看起来很好,然后使用成像工具手动将图像分组在一起。只要保持y轴的值相同,就应该可以做得很好