【问题标题】:Matplotlib: Grouped boxplots using data from numpy array and lists of group/subgroup labelsMatplotlib:使用 numpy 数组中的数据和组/子组标签列表的分组箱线图
【发布时间】: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


【解决方案1】:

@cphlewis:非常感谢:根据您的建议,我们重写了代码,数据格式为元组列表(任务、数据),现在可以控制绘制任务的顺序。

MWE 在下面发布,以防这对其他人有帮助。

import matplotlib.pyplot as plt

data = [[('A'),[[1,2,3,4,9],[2,3,4,4,4],[3,4,4,5,5],[5,6,6,7,7,7]]],
    [('B'),[[2,3,4,4,5],[3,4,5,6,10],[4,5,6,6,7],[5,6,7,7,8]]],
     [('C'),[[4,5,6,6,10],[6,7,8,8,8],[7,8,9,9,10],[2,10,11,11,12]]]
     ]
attemptlist = ['1st','2nd','3rd','4th'] 
fig, axes = plt.subplots(ncols= len(data), sharey=True)
fig.subplots_adjust(wspace=0)

for ax,d in zip(axes,data):     
    ax.boxplot([d[1][attemptlist.index(attempt)] for attempt in attemptlist],showfliers=False)
    ax.set(xticklabels=attemptlist, xlabel=d[0])
plt.show()

【讨论】:

    猜你喜欢
    • 2013-05-11
    • 2020-02-21
    • 2011-11-07
    • 1970-01-01
    • 2022-01-26
    • 2022-01-25
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    相关资源
    最近更新 更多