Ну, я не горжусь этим.Но это работает.Надеюсь, кто-то более знающий придет с лучшим решением.
Я начну с настройки ваших данных:
import matplotlib.pyplot as plt
from matplotlib.lines import Line2D
import numpy as np
import pandas as pd
data = np.array([
'id', 'approach', 'outcome',
'a1', 'approach1', 'outcome1',
'a1', 'approach1', 'outcome2',
'a1', 'approach1', 'outcome2',
'a1', 'approach1', 'outcome2',
'a1', 'approach1', 'outcome2',
'a1', 'approach2', 'outcome1',
'a1', 'approach2', 'outcome1',
'a1', 'approach2', 'outcome1',
'a1', 'approach2', 'outcome1',
'a1', 'approach2', 'outcome1',
'a1', 'approach3', 'outcome1',
'a1', 'approach3', 'outcome1',
'a1', 'approach3', 'outcome1',
'a1', 'approach3', 'outcome1',
'a1', 'approach3', 'outcome1',
'a2', 'approach1', 'outcome2',
'a2', 'approach1', 'outcome1',
'a2', 'approach1', 'outcome1',
'a2', 'approach1', 'outcome2',
'a2', 'approach1', 'outcome1',
'a2', 'approach2', 'outcome1',
'a2', 'approach2', 'outcome1',
'a2', 'approach2', 'outcome2',
'a2', 'approach2', 'outcome1',
'a2', 'approach2', 'outcome2',
'a2', 'approach3', 'outcome2',
'a2', 'approach3', 'outcome2',
'a2', 'approach3', 'outcome1',
'a2', 'approach3', 'outcome2',
'a2', 'approach3', 'outcome1'])
data = data.reshape(data.size // 3, 3)
df = pd.DataFrame(data[1:], columns=data[0])
Далее я подсчитываю все случаи "outcome1"
и "outcome2"
для каждого подхода и идентификатора.(Я уверен, что это может быть сделано непосредственно в пандах, но я немного новичок в пандах):
dict = {}
for id in 'a1', 'a2':
dict[id] = {}
for approach in 'approach1', 'approach2', 'approach3':
dict[id][approach] = {}
for outcome in 'outcome1', 'outcome2':
dict[id][approach][outcome] = ((df['id'] == id)
& (df['approach'] == approach)
& (df['outcome'] == outcome)).sum()
plot_data = pd.DataFrame(dict)
Теперь все, что осталось, - это построить заговор.
fig, ax = plt.subplots(1, 1)
i = 0
for id in 'a1', 'a2':
for approach in 'approach1', 'approach2', 'approach3':
ax.bar(i, plot_data[id][approach]["outcome1"], color='g')
ax.bar(i, plot_data[id][approach]["outcome2"],
bottom=plot_data[id][approach]["outcome1"], color='r')
i += 1
i+=1
ax.set_xticklabels(['', 'approach1', 'approach2', 'approach3', '',
'approach1', 'approach2', 'approach3'], rotation=45)
custom_lines = [Line2D([0], [0], color='g', lw=4),
Line2D([0], [0], color='r', lw=4)]
ax.legend(custom_lines, ['Outcome 1', 'Outcome 2'])
