Matplotlib: Сгруппированные коробочные диаграммы, использующие данные из массива numpy и списки меток групп / подгрупп
Я новичок в Matplotlib / Python и пытаюсь сделать сгруппированный боксплот очень похожим на отличный пример Джо Кингтона, показанный здесь:
как сделать сгруппированный граф boxplot в matplotlib
Я хотел бы изменить пример Джо для моих собственных требований.
Для моих демонстрационных данных ниже, у меня есть 5 человек, у каждого из которых есть 4 попытки ( = "попытки": "1-й", "2-й", "3-й", "4-й") на каждую из 3 различных задач ( = "задачи": ' А", 'В', 'С').
Я хотел бы иметь возможность:
1) введите мои данные в виде серии двумерных массивов-пустышек, по одному массиву на задачу, как показано, каждый из которых состоит из оценок 5 человек, вложенных в 4 последовательных попытки.
2) пометить как задачи, так и попытки на общей оси x графика, используя строки, сохраненные как последовательные элементы в списках "список задач" и "список попыток" соответственно.
3) обобщить решение для создания соответствующих графиков для любого числа лиц и любого количества задач, каждая из которых требует любого количества повторных попыток.
Изменить: 2 апреля 2015:
Единственная нерешенная проблема - это, казалось бы, нелогичный способ, которым списки Python собираются в непоследовательном порядке при использовании метода.keys(); следовательно, мой список задач продолжает называться "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()
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()