因为我们知道总百分比将是sample_ids
%,所以我们只需将"False"值设置为1.然后,我们可以融化sample_ids
列上的数据帧,重命名这些列,并将所有内容乘以sample_ids
(以使它们成为百分比).从这里,我们将通过 Select 包含F
的percs
列中的值来获取"False"百分比,然后用Seborn将其绘制成图,以便我们可以将色调设置为perc
名称.将调色板设置为您想要的任何 colored颜色 ,然后将Alpha设置为0.5,以使真和假百分比之间的差异更加明显.然后在后面绘制真实百分比(这将它们放在错误百分比条形图的前面),您就得到了堆叠的条形图:
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = (20,10)
df = pd.DataFrame({'sample_ids':['sample1', 'sample2', 'sample3'],
'perc_A':[0.75,0.66667,0.70213],
'perc_B':[0.18182,0.24747,0.28176],
'perc_C':[0.4222,0.15823,0.17925]})
df[['perc_F_A', 'perc_F_B', 'perc_F_C']] = 1
meltedDF = df.melt(id_vars=['sample_ids'], var_name='perc', value_name='percent')
meltedDF['percent']=meltedDF['percent']*100
sns.barplot(data=meltedDF[meltedDF.perc.str.contains('F')], x='sample_ids', y='percent', hue='perc', palette=['blue','green','red'], alpha=0.5)
sns.barplot(data=meltedDF[~meltedDF.perc.str.contains('F')], x='sample_ids', y='percent', hue='perc', palette=['blue','green','red'])
plt.show()
图表:
顺便说一句,如果你确实想要你的"假"百分比的真实价值,一个更好的方法是这样做:
df = pd.DataFrame({'sample_ids':['sample1', 'sample2', 'sample3'],
'perc_A':[0.75,0.66667,0.70213],
'perc_B':[0.18182,0.24747,0.28176],
'perc_C':[0.4222,0.15823,0.17925]})
df[['perc_F_A', 'perc_F_B', 'perc_F_C']] = df.groupby('sample_ids').apply(lambda x: 1-x)
输出:
sample_ids perc_A perc_B perc_C perc_F_A perc_F_B perc_F_C
0 sample1 0.75000 0.18182 0.42220 0.25000 0.81818 0.57780
1 sample2 0.66667 0.24747 0.15823 0.33333 0.75253 0.84177
2 sample3 0.70213 0.28176 0.17925 0.29787 0.71824 0.82075