JB1*_*JB1 5 python matplotlib pandas seaborn
我试图用我的数据帧在seaborn中创建一个堆积的条形图.
我首先在pandas中生成了一个交叉表,如下所示:
pd.crosstab(df['Period'], df['Mark'])
Run Code Online (Sandbox Code Playgroud)
返回:
Mark False True
Period BASELINE 583 132
WEEK 12 721 0
WEEK 24 589 132
WEEK 4 721 0
Run Code Online (Sandbox Code Playgroud)
我想使用seaborn来创建一个堆积的条形图以保持一致,这就是我用于其余图形的内容.我一直在努力做到这一点,因为我无法索引交叉表.
我已经能够在大熊猫中使用我想要的情节,.plot.barh(stacked=True)但是没有运气与seaborn.我有什么想法可以做到这一点?
谢谢
Imp*_*est 17
正如您所说,您可以使用pandas来创建堆积条形图.你希望拥有"seaborn plot"的论点是无关紧要的,因为每个seaborn图和每个pandas图最终只是matplotlib对象,因为两个库的绘图工具仅仅是matplotlib包装器.
所以这是一个完整的解决方案(从@ andrew_reece的答案中获取数据).
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
n = 500
mark = np.random.choice([True,False], n)
periods = np.random.choice(['BASELINE','WEEK 12', 'WEEK 24', 'WEEK 4'], n)
df = pd.DataFrame({'mark':mark,'period':periods})
ct = pd.crosstab(df.period, df.mark)
ct.plot.bar(stacked=True)
plt.legend(title='mark')
plt.show()
Run Code Online (Sandbox Code Playgroud)
创建 Seaborn 的人不喜欢堆叠条形图(但该链接有一个 hack,它使用 Seaborn + Matplotlib 来制作它们)。
如果您愿意接受分组条形图而不是堆叠条形图,这里有一种方法:
# first some sample data
import numpy as np
import pandas as pd
import seaborn as sns
N = 1000
mark = np.random.choice([True,False], N)
periods = np.random.choice(['BASELINE','WEEK 12', 'WEEK 24', 'WEEK 4'], N)
df = pd.DataFrame({'mark':mark,'period':periods})
ct = pd.crosstab(df.period, df.mark)
mark False True
period
BASELINE 118 111
WEEK 12 117 149
WEEK 24 117 130
WEEK 4 127 131
# now stack and reset
stacked = ct.stack().reset_index().rename(columns={0:'value'})
# plot grouped bar chart
sns.barplot(x=stacked.period, y=stacked.value, hue=stacked.mark)
Run Code Online (Sandbox Code Playgroud)