【发布时间】:2015-04-01 16:53:39
【问题描述】:
我是 Matplotlib / Python 的新手,我正在尝试制作一个非常类似于 Joe Kington 的出色示例的分组箱线图:
how to make a grouped boxplot graph in matplotlib
我想根据自己的要求修改 Joe 的示例。
对于下面的演示数据,我有 5 个人,每个人在 3 个不同的任务(=“任务“:'A','B','C')。
我希望能够:
1) 将我的数据作为一系列 2D numpy 数组输入,如图所示,每个任务一个数组,每个数组由嵌套在 4 次连续尝试中的 5 个人的分数组成。
2) 使用字符串在绘图的共享 x 轴上标记任务和尝试,分别保存为列表“tasklist”和“attemptlist”中的顺序项。
3) 推广解决方案,为任意数量的个体和任意数量的任务绘制适当的图,每个任务都需要任意次数的重复尝试。
编辑: 2015 年 4 月 2 日:
唯一突出的问题是在使用 .keys() 方法时,Python 列表将自身组装成非顺序顺序的看似违反直觉的方式;因此我的任务列表一直显示为“A,C,B”而不是“A,B,C”。 解决方法是导入并创建有序字典。这对我来说是全新的,但这似乎要求我的任务列表中的项目名称声明两次,就像乔在他的示例中所做的那样 - 一次将任务与相应的数据矩阵相关联,一次将项目名称关联到具有相应顺序数字键的有序字典...
想知道:是否有一种方法(类似于常规字典的 .keys() 方法)可以遍历我的数据矩阵以按显示的顺序(“A、B、C”)创建有序字典,而无需要求我输入两次任务列表的详细信息?
非常感谢
戴夫
import matplotlib.pyplot as plt
import numpy as np
data = {}
data ['A'] = np.array([[1,2,3,4,9],[2,3,4,4,4],[3,4,4,5,5],[5,6,6,7,7,7]])
data ['B'] = np.array([[2,3,4,4,5],[3,4,5,6,10],[4,5,6,6,7],[5,6,7,7,8]])
data ['C'] = np.array([[4,5,6,6,10],[6,7,8,8,8],[7,8,9,9,10],[2,10,11,11,12]])
tasklist = data.keys() # list of labels for tasks 'A' to 'C' (each containing 4 attempts labelled '1st' to '4th')
attemptlist = ['1st','2nd','3rd','4th'] # list of labels for attempts 1 to 4 within each task
fig, axes = plt.subplots(ncols= len(tasklist), sharey=True)
fig.subplots_adjust(wspace=0)
for ax,task in zip(axes,tasklist):
ax.boxplot([data[task][attemptlist.index(attempt)] for attempt in attemptlist],showfliers=False)
ax.set(xticklabels=attemptlist, xlabel=task)
plt.show()
【问题讨论】:
-
这仍然是一种代码转储——您将问题组织成步骤很好,所以一次处理每个步骤,并就失败的步骤提出具体问题。
-
为之前的伪劣代码道歉并感谢您的鼓励:现在已经编辑了我的代码并更新了我的查询。
-
剪掉所有不再适用的文本!另外,我不明白为什么你需要一个字典,如果你需要它排序 - 你可以制作一个元组列表并对其进行迭代:
for label, d in [('A'), [...]),('B',[...])]。
标签: arrays numpy matplotlib nested boxplot