我有一个数据框:
import pandas as pd
import numpy as np
df = pd.read_csv(r'https://exploratory.io/data/kanaugust/2016-California-Election-Data-oTv4Hgd1UT/2016%20California%20Election%20Data.csv')
df['cluster'] = [3, 3, 1, 2, 1, 1, 3, 1, 1, 2, 1, 3, 2, 1, 1, 1, 2, 1, 3, 1, 3, 1, 3, 2, 1, 2, 3, 3, 2, 2, 1, 1, 2, 2, 2, 2, 2, 3, 2, 2, 3, 3, 3, 3, 1, 1, 1, 2, 3, 2, 1, 1, 1, 1, 1, 2, 3, 1]
df = df.drop(columns=['COUNTY_NAME', 'PARTY_NAME']).groupby('cluster').agg(['mean', 'std'])
df
我想像这样制作图形:
对于每个簇,每条线绘制为连接三个点的线。 中间是列均值,下点是均值-std,上限是均值+ std。 例如,对于“一次性塑料袋禁令”和“群集3”,下点是0.647902-0.065703,中点是0.647902,上点是0.647902 + 0.065703。
应该在每个x位置绘制三个群集,每个群集的颜色不同。
matplotlib错误栏可能会达到目的,但是我不知道如何使用它生成上面显示的图形。 也许seaborn也很好?
如何绘制这种图形?
答案 0 :(得分:1)
使用errorbar的一种方法:
df = df.drop(columns=['COUNTY_NAME', 'PARTY_NAME']).groupby('cluster').agg(['mean', 'std'])
# change categories to index
new_df = df.T.unstack()
fig, ax = plt.subplots(1,1, figsize=(16,10))
for i in range(1,4):
ax.errorbar(range(len(new_df)), new_df[new_df.columns[2*i-2]],
yerr=new_df[new_df.columns[2*i-1]], fmt='x',
label=f'Cluster {i}')
ax.set_xticks(range(len(new_df)))
ax.set_xticklabels(new_df.index)
ax.legend()
plt.show()
输出并不完美,但我将细节留给您: