【发布时间】:2016-11-02 01:24:17
【问题描述】:
要求:
- 我正在尝试创建一个条形图,其中对于每个条件(“标签”),我会显示每个操作(“模式”)的平均任务时间。因此,将有 8 组,每组 3 个小节,一组只有一个小节。
- 我需要在每个条上显示误差线(标准误差)。
- 我希望通过使用其他一些指标完成的一些计算来确定每个条件/标签的顺序。 (这些我已经从标签 ==> 索引/顺序中提取到字典映射中)
- 我将绘制其他一些图表,其中使用的任何排序顺序在其他图表中也必须相同
- 这适用于 Python 2.7、Pandas 0.18 和 IPython Notebook
- (数据帧是从csv文件加载的,不是直接构造的)
问题:
所以,这就是图表当前的样子:
我已经替换/删除了此处上传的标签,但是,就像这些标签一样,原件也是按字母顺序排序的。
这就是问题所在:我不希望每种技术都按字母顺序排序。相反,我希望它们根据我在单独列表中获得的排序顺序进行排序(即,这样我就可以让它们按顺序显示 - 从最短到最高,同时保持相同的顺序图表)。
当前代码:
所以,我从 csv 文件加载完整的数据集:
p = pd.read_csv("...", sep='\t')
然后,我使用 groupby 提取“task_time”数据来绘制每个条形:
tt_all = p.groupby(['label', 'pattern'])[['task_time']]
然后通过以下方式绘制:
tt_all.mean().unstack().plot(kind='bar', yerr=tt_all.sem().unstack(), figsize=(15, 6), cmap=cmap, edgecolor='None', rot=45)
(如果没有 unstack(),它只会将所有内容都归为一个类别并造成混乱)
我尝试过的:
经过一番摸索,我设法得到了以下信息:
# Create a column to use for sorting things
sort_order_keys = {'I': 8, 'F': 3, 'H': 7, 'G': 1, 'D': 2, 'C': 5, 'E': 6, 'A': 4, 'B': 0}
p['label_sort_key'] = p['label'].apply(lambda x: sort_order_keys[x])
# This sorts all the rows by the sort order
tt_all_raw = p.sort(['label_sort_key', 'pattern'])
tt_all_raw = tt_all_raw.iloc[tt_all_raw['label_sort_key'].argsort()]
print tt_all_raw # <--- This will be sorted correctly
# Performing grouping....
tt_all = tt_all_raw.groupby(['label', 'pattern'], sort=False)[['task_time']]
print tt_all.mean() # <---- This will also be sorted correctly
print tt_all.mean().unstack() # <--- This however forces everything back to alphabetical order! Argh!
问题
- 如何重新排序 unstack() 结果?或
- 有没有更简单的方法来设置这样的图表,满足这些要求?
【问题讨论】:
标签: sorting pandas matplotlib bar-chart