对不起,如果这个问题是重复的,因为我无法找到解决方案.

日期范围的I:

| sample_ids | perc_A | perc_B | perc_C |
|------------|--------|--------|--------|
| sample 1   | 0.75   | 0.18182| 0.42222|
| sample 2   | 0.66667| 0.24747| 0.15823|
| sample 3   | 0.70213| 0.28176| 0.17925|

With this, I would like to plot a 100% stacked and grouped bar chart (as shown below; a similar image taken from GitHub). enter image description here


详细说明如图所示:
假设样本1为Apples,对于条块A,75%将是深紫色(图例:True_perc_a),25%将是浅紫色(图例:False_perc_a);对于条块B,18.19%将是深绿色(图例:True_perc_b),81.81%将是淡绿色(图例:False_perc_b);对于条块C,42.22%将是深黄色(图例:true_perc_c),57.78%将是浅黄色(图例:False_perc_c).同样的条件也适用于样本2和样本3.

我能够对数据进行处理,以获得正确和错误的PERC.例如:

df['perc_A'] = (df['perc_A']*100).round(2)
df['perc_F_A'] = (100 - df['perc_A']).round(2)

然而,我有一些困难来绘制这个数字.

推荐答案

因为我们知道总百分比将是sample_ids%,所以我们只需将"False"值设置为1.然后,我们可以融化sample_ids列上的数据帧,重命名这些列,并将所有内容乘以sample_ids(以使它们成为百分比).从这里,我们将通过 Select 包含Fpercs列中的值来获取"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()

图表:

enter image description here

顺便说一句,如果你确实想要你的"假"百分比的真实价值,一个更好的方法是这样做:

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

Python相关问答推荐

我对打乒乓球有问题

从Python调用GMP C函数时的分段错误和内存泄漏

PyQt5如何将pyuic 5生成的Python类添加到QStackedWidget中?

如何修复使用turtle和tkinter制作的绘画应用程序的撤销功能

如何用symy更新分段函数

在函数内部使用eval(),将函数的输入作为字符串的一部分

PywinAuto在Windows 11上引发了Memory错误,但在Windows 10上未引发

类型错误:输入类型不支持ufuncisnan-在执行Mann-Whitney U测试时[SOLVED]

运行终端命令时出现问题:pip start anonymous"

管道冻结和管道卸载

Python,Fitting into a System of Equations

如何调整QscrollArea以正确显示内部正在变化的Qgridlayout?

如何创建一个缓冲区周围的一行与manim?

梯度下降:简化要素集的运行时间比原始要素集长

在www.example.com中使用`package_data`包含不包含__init__. py的非Python文件

dask无groupby(ddf. agg([min,max])?''''

如何排除prefecture_related中查询集为空的实例?

matplotlib图中的复杂箭头形状

跳过嵌套JSON中的级别并转换为Pandas Rame

为什么调用函数的值和次数不同,递归在代码中是如何工作的?