![](/img/trans.png)
[英]Using separate scales for each group in a grouped and stacked barplots in Altair
[英]100% Stacked and grouped barplots using matplotlib
抱歉,如果此問題重復,因為我無法找到解決方案。
我確實有一個數據框:
| 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|
有了這個,我想 plot 一個 100% 堆疊和分組的條形圖(如下所示;類似的圖像取自 GitHub)。
根據提供的圖進行詳細說明:
假設樣本 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)
但是,我對 plot 的圖有些困難。
因為我們知道總百分比將是 100%,所以我們可以將“False”值設置為 1。然后,我們可以在sample_ids
列上融化 dataframe,重命名列,然后將所有內容乘以 100(使它們成為百分比)。 從這里,我們將通過選擇包含F
的percs
列中的值來獲取“錯誤”百分比,然后使用 Seaborn 繪制它,以便我們可以將色調設置為perc
名稱。 將調色板設置為您想要的任何 colors,然后將 alpha 設置為 0.5 以使真假百分比之間的差異更加明顯。 然后在之后繪制真實百分比(這將它們放在錯誤百分比條的前面)並且您有堆疊條 plot:
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)
Output:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.