我想用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)
(对裁剪后的图表示歉意,整个内容太大而无法发布)
以下代码,使用相同的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)
我如何获得所有变量的上述图形,并用适当的小提琴图显示其kde?
任何对此的经验丰富的建议将不胜感激。
编辑: 我用来创建数据的csv文件的链接在此处,yourfilelink.com / get.php?fid = 2025783
答案 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()
这几乎与您在海上小提琴情节中看到的相同,但当然是转置的。
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()))
现在您可以分别更清晰地查看每个变量的视图(它们有多少种模式,它们有多倾斜,尾巴有多长...),但是您既不能比较比例,也不能比较变量之间的离散度。
这个故事的寓意是,您无法一次看到所有内容,必须根据数据中的查找内容进行选择。