[英]Create grouped/stacked bar plots from multiple categories containing several labels inside a pandas dataframe
我有以下pandas
數據框( df
)[ 僅是完整數據框的一部分 ]:
Name Cat_1 Cat_2
0 foo P Apples, Pears, Cats
1 bar R, M Apples
2 bla E Pears
3 blu F Cats, Pears
4 boo G Apples, Pears
5 faa P, E Apples, Cats
我想創建從Cat_1
和Cat_2
構建的Cat_2
。 這些列包含多個標記,這些標記必須用於繪圖。
當前,我正在運行以下簡單代碼來繪制Cat_1
:
import pandas as pd
from matplotlib import pyplot as plt
fig, ax = plt.subplots(figsize = (4,4))
s = df["Cat_1"].str.split(", ", expand = True).stack()
s.value_counts().plot(kind = 'bar', ax = ax)
這會為Cat_1
每個不同標簽返回一個漂亮的條形圖,允許進行多個分配(按預期進行)。
可以將相同的內容應用於Cat_2
並獲得帶有相應標簽的單獨圖。
但是,我希望有一個圖,該圖首先由Cat_1
“堆疊”,然后為Cat_2
計算值。
我想想辦法是建立一個嵌套的字典,如下所示:
{"P": {"Apples": 2, "Pears": 1, "Cats": 2}, "R": {"Apples": 1}, ....}
但同時要跟蹤Cat_1
的總數。
到底是分組條形圖還是堆疊條形圖都沒關系。
請看一下隨附的圖,以獲得更直觀的想法:
如果我理解正確的話,這應該可以讓您接近。
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
df = pd.DataFrame(columns=['Name', 'Cat_1', 'Cat_2'])
df['Name'] = ['foo', 'bar', 'bla', 'blu', 'boo', 'faa']
df['Cat_1'] = ['P', 'R, M', 'E', 'F', 'G', 'P, E']
df['Cat_2'] = ['Apples, Pears, Cats', 'Apples', 'Pears', 'Cats, Pears', 'Apples, Pears', 'Apples, Cats']
# arrange data simply prepopulate with zero
df_pl = pd.DataFrame(columns=df["Cat_1"].str.split(", ", expand=True).stack().unique().tolist(),
index=df["Cat_2"].str.split(", ", expand=True).stack().unique().tolist(),
data=0)
# get chunk size for each combination
for x in df_pl.columns:
ind = df.Cat_1.str.contains(x)
for name in df_pl.index:
df_pl.set_value(name, x, df.loc[ind, 'Cat_2'].str.contains(name).sum())
N = len(df_pl.columns)
ind = np.arange(N) # the x locations for the groups
width = 0.35 # the width of the bars: can also be len(x) sequence
plotted = []
p = {}
for name in df_pl.index:
bottoms = df_pl.index.isin(plotted).sum()
p[name] = plt.bar(ind, df_pl.loc[name].values.tolist(), bottom=bottoms)
plotted.append(name)
plt.ylabel('y_label')
plt.title('some plot')
plt.xticks(ind, df_pl.columns.tolist())
plt.legend(p.values(), p.keys())
plt.show()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.