Python Pandas和matplotlib堆叠条形图,主要和次要x记号组合在一起

Python Pandas和matplotlib堆叠条形图,主要和次要x记号组合在一起,python,pandas,matplotlib,Python,Pandas,Matplotlib,我有以下数据: 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,

我有以下数据:

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
我从另一个用户那里找到了下面的图表,这正是我希望实现的目标:

但是我们没有果实,我们有ID,我们有方法,而不是岁月

以下是我迄今为止所做的工作:

df = pandas.read_csv("test.txt", sep=r',\s+', engine = "python")
fig, ax = plt.subplots(1, 1, figsize=(5.5, 4))

data = df[df.approach == "approach1"].groupby(["id", "outcome"], sort=False)["outcome"].count().unstack(level=1)
data.plot.bar(width=0.5, position=0.6, color=["g", "r"], stacked=True, ax=ax)

data = df[df.approach == "approach2"].groupby(["id", "outcome"], sort=False)["outcome"].count().unstack(level=1)
data.plot.bar(width=0.5, position=-0.6, color=["g", "r"], stacked=True, ax=ax)

# "Activate" minor ticks
ax.minorticks_on()

rects_locs = []
p = 0
for patch in ax.patches:
    rects_locs.append(patch.get_x() + patch.get_width())
    # p += 0.01

# Set minor ticks there
ax.set_xticks(rects_locs, minor = True)

# Labels for the rectangles
new_ticks = ["Approach1"] * 10 + ["Approach2"] * 10

# Set the labels
from matplotlib import ticker
ax.xaxis.set_minor_formatter(ticker.FixedFormatter(new_ticks))  #add the custom ticks

# Move the category label further from x-axis
ax.tick_params(axis='x', which='major', pad=15)

# Remove minor ticks where not necessary
ax.tick_params(axis='x',which='both', top='off')
ax.tick_params(axis='y',which='both', left='off', right = 'off')
plt.xticks(rotation=0)
但是输出不好:


所以基本上我想把
id
作为主要的x记号(因此应该有2个这样的x值),然后每个id应该有3个分组的堆叠条(approach 1,approach 2,approach 3)。

好吧,我并不为此感到骄傲。但它是有效的。希望有更有知识的人会提出更好的解决方案

我首先设置您的数据:

导入matplotlib.pyplot作为plt
从matplotlib.lines导入Line2D
将numpy作为np导入
作为pd进口熊猫
data=np.array([
“id”、“方法”、“结果”,
‘a1’、‘接近1’、‘结果1’,
‘a1’、‘接近1’、‘结果2’,
‘a1’、‘接近1’、‘结果2’,
‘a1’、‘接近1’、‘结果2’,
‘a1’、‘接近1’、‘结果2’,
‘a1’、‘接近2’、‘结果1’,
‘a1’、‘接近2’、‘结果1’,
‘a1’、‘接近2’、‘结果1’,
‘a1’、‘接近2’、‘结果1’,
‘a1’、‘接近2’、‘结果1’,
‘a1’、‘接近3’、‘结果1’,
‘a1’、‘接近3’、‘结果1’,
‘a1’、‘接近3’、‘结果1’,
‘a1’、‘接近3’、‘结果1’,
‘a1’、‘接近3’、‘结果1’,
‘a2’、‘接近1’、‘结果2’,
‘a2’、‘接近1’、‘结果1’,
‘a2’、‘接近1’、‘结果1’,
‘a2’、‘接近1’、‘结果2’,
‘a2’、‘接近1’、‘结果1’,
‘a2’、‘接近2’、‘结果1’,
‘a2’、‘接近2’、‘结果1’,
‘a2’、‘接近2’、‘结果2’,
‘a2’、‘接近2’、‘结果1’,
‘a2’、‘接近2’、‘结果2’,
‘a2’、‘接近3’、‘结果2’,
‘a2’、‘接近3’、‘结果2’,
‘a2’、‘接近3’、‘结果1’,
‘a2’、‘接近3’、‘结果2’,
“a2”、“接近3”、“结果1]”)
data=data.restrape(data.size//3,3)
df=pd.DataFrame(数据[1:],列=数据[0])
接下来,我统计了每种方法和id中出现的所有
“outcome1”
“outcome2”
(我确信这可以直接在pandas中完成,但我有点像pandas新手):

dict={}
对于“a1”、“a2”中的id:
dict[id]={}
对于“进近1”、“进近2”、“进近3”中的进近:
dict[id][approach]={}
对于“结果1”、“结果2”中的结果:
dict[id][approach][outcome]=((df['id']==id)
&(df['进近]==进近)
&(df['outcome']==outcome)).sum()
绘图数据=局部数据帧(dict)
现在剩下的就是做绘图了

fig,ax=plt.子批次(1,1)
i=0
对于“a1”、“a2”中的id:
对于“进近1”、“进近2”、“进近3”中的进近:
ax.bar(i,绘图数据[id][approach][outcome1],color='g')
ax.bar(i,绘图数据[id][approach][“outcome 2”],
底部=绘图\u数据[id][approach][“outcome1”],color='r')
i+=1
i+=1
ax.set_xticklabels(['','approach 1','approach 2','approach 3','',
‘进近1’、‘进近2’、‘进近3’],旋转=45)
自定义线=[Line2D([0],[0],color='g',lw=4),
Line2D([0],[0],color='r',lw=4)]
ax.图例(自定义_行,['Output 1','Output 2'])