Иерархическое построение кадра данных панд, показывающего визуализацию коробочного графика - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть многомерный набор данных, который выглядит следующим образом: enter image description here

Моя цель - сгенерировать блокпост для визуализации распределения значений в Treat1, Treat2, Treat3 и Treat4.

Я могу получить диаграмму, чтобы получить именно то, что я хочу, основываясь на Как добавить групповые метки для гистограмм в matplotlib? enter image description here

Однако мое требование состоит в том, чтобы на блок-графике было показано распределение между средним и выбросным значением для каждой группы лечения.Я снова вставляю код, который генерирует гистограмму, основанную на коде стека переполнения https://stackoverflow.com/users/2846871/varicus

df = df2.groupby(['Group','Category','Day ']).sum()
fig = plt.figure(figsize=(20,8))
ax = fig.add_subplot(111)
df.plot(kind='bar',stacked=False,ax=fig.gca())
labels = ['' for item in ax.get_xticklabels()]
ax.set_xticklabels(labels)
ax.set_xlabel('')
label_group_bar_table(ax, df)
fig.subplots_adjust(bottom=.1*df.index.nlevels)
plt.show()

Что было бы лучшим способом для создания Boxplot вместо каждого столбца.

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Я добавил часть кода, которая выполняет свою работу, однако я хотел, чтобы у каждой категории был свой цвет лица.Я не могу различить категории через график.

fig, ax = plt.subplots(figsize = (20,8))


#Note showfliers=False is more readable, but requires a recent version iirc
bp = df_Dummy.boxplot(by = ['Group','Category','Day '],ax=ax, 
sym='',rot=90,return_type='dict',patch_artist=False)


[[item.set_linewidth(2) for item in bp[key]['boxes']] for key in bp.keys()]


[[item.set_linewidth(2) for item in bp[key]['fliers']] for key in bp.keys()]
[[item.set_linewidth(2) for item in bp[key]['medians']] for key in bp.keys()]
[[item.set_linewidth(2) for item in bp[key]['means']] for key in bp.keys()]
[[item.set_linewidth(2) for item in bp[key]['whiskers']] for key in bp.keys()]
[[item.set_linewidth(2) for item in bp[key]['caps']] for key in bp.keys()]
colors = ['pink', 'lightblue', 'lightgreen','yellow']
[[item.set_color in zip(colors) for item in bp[key]['boxes']] for key in bp.keys()]
# seems to have no effect
[[item.set_color('b') for item in bp[key]['fliers']] for key in bp.keys()]
[[item.set_color('m') for item in bp[key]['medians']] for key in bp.keys()]
[[item.set_markerfacecolor('k') for item in bp[key]['means']] for key in bp.keys()]
[[item.set_color('c') for item in bp[key]['whiskers']] for key in bp.keys()]
[[item.set_color('y') for item in bp[key]['caps']] for key in bp.keys()]

ax.margins(y=0.05)

enter image description here

0 голосов
/ 13 февраля 2019

Может быть, это то, что вы ищете.

# I create a dataframe similar to yours for others to give other solutions.

group = [1,1,1,1,2,2,4,4, 2, 2, 3, 2, 2, 4, 4, 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 1,1]
cateogry = [0,0,1,1,0,0,0,0,1,1,1,1,2,2,2,2,3,3,0,0,1,1,0,0,2,2,2]
Treat1 = np.random.randint(0, 100, size= len(group))
Treat2 = np.random.randint(0, 100, size= len(group))
Treat3 = np.random.randint(0, 100, size= len(group))
Treat4 = np.random.randint(0, 100, size= len(group))
df = pd.DataFrame.from_dict({'Group': group, "Category": cateogry, "Treat1": Treat1,"Treat2": Treat2,"Treat3": Treat3,"Treat4": Treat4, })

f = df.boxplot(by = ['Group','Category'],figsize = (12,8))

приведет к enter image description here

...