簡體   English   中英

使用 matplotlib 的 100% 堆疊和分組條形圖

[英]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(使它們成為百分比)。 從這里,我們將通過選擇包含Fpercs列中的值來獲取“錯誤”百分比,然后使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM