我有一张这样的桌子:
ID var1. var2. var3. var4. var5. var6. var7 var8 var9 ... var22 ...
A. 1. 1. 7. 0. 0.6. 0. 7. 2. 2,4. ....
B 9. 1. 7. 0. 0.6. 0. 7. 2. 2,4. ....
C 0. 1. 0. 8. 0.5. 5. 7. 2.9. 2,8. ....
而且我想为每个ID建立条形图并将它们全部绑定在面板上,我对面板的想法就像here。因此,“ x”将是变量(即列名),“ y”将是此数据帧中列的值。
一个重要的事情是我不想要在图上显示具有给定ID的零值的变量,例如:对于ID'A',var4和var6例如,它们不会出现在ID为“ A”的图形上,但是它们将会出现在ID为“ C”的图形上。
到目前为止,我有:
列的换位:
df_melted = res.melt(id_vars='ID')
然后我删除所有零:
df_melted_no_zeros = df_melted[df_melted.value != 0]
然后由于无法建立面板,我按一个ID进行过滤:
ID_A = df_melted_no_zeros[(df_melted_no_zeros.ID == "A")]
然后在图上有很多变量,我找不到如何将它们放在图上可读的方式,因为名称太多(例如x轴上的每个图20个)。对我来说,它将仅显示前5个值的图例,但我无法做到这一点。Als我的变量大部分在0.004到0.009之间,但是总是有两个变量,其值为4或5,因此其余部分与图上无关。
fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
variables = ID_A['variable']
values = ID_A['value']
ax.bar(variables,values)
plt.show()
使用DataFrame的此子集:
编号var1。 var2。 var3。 var4。 var5。 var6。 var7 var8 var9A. 1. 1. 7. 0. 0.6 0. 7. 2. 2.4B 9. 1. 7. 0. 0.6 0. 7. 2. 2.4C 0. 1. 0. 8. 0. 5. 7. 2.9 2.8
从宽到长:
df_melted = df.melt(id_vars='ID')
提取可变数字(您不需要此数字,但它与样本有关):
df_melted['var'] = df_melted['variable'].str.extract('(\d+)')[0]
只获取前几个:
df_top5 = df_melted[df_melted['value'].isin(
df_melted.groupby('ID')['value'].nlargest(5).unique())]
带有seaborn的图:
import seaborn as sns
g = sns.FacetGrid(df_top5,col="ID",sharex=False,sharey=False,col_wrap=2)
g.map(sns.barplot,'var','value',order=None,hue=df_top5['var'],
dodge=False,palette='deep')
plt.show()