Matplotlib堆积条形图系列没有显示

时间:2017-09-06 15:31:28

标签: python matplotlib

为什么第二个系列并不总是出现,如下所示?

场景1:

score_sim = (70, 80, 90)
score_feat = (10, 20, 30)
ind = np.arange(len(score_sim))
width = 0.35

p1 = plt.bar(ind, score_feat, width)
p2 = plt.bar(ind, score_sim, width)

给予:enter image description here

p2没有显示?

场景2:

score_sim = (70, 80, 90)
score_feat = (100, 200, 300)
ind = np.arange(len(score_sim))
width = 0.35

p1 = plt.bar(ind, score_feat, width)
p2 = plt.bar(ind, score_sim, width)

给予:enter image description here

那么,为什么只有第二个显示两个系列? 我希望蓝色系列在绿色系列之下。我该怎么做?

2 个答案:

答案 0 :(得分:2)

在方案1中,score_feat的条形图已正确绘制,但随后它们被score_sim的值覆盖。 plt.bar有一个参数bottom,它接受​​一个标量或一个数组,并指定一个条的垂直起始点。例如如果要在方案1上堆叠两个系列的条形,请使用第二个绘图命令:

p2 = plt.bar(ind, score_sim, width,bottom=score_feat)

答案 1 :(得分:1)

在场景1中,第二个图的条形图大于第一个图形的条形图。因此它们覆盖其他条形图。在方案2中,第二个绘图的条形小于第一个条形的条形,因此背景中的条形仍然可见。

请注意,两个图都没有显示“堆叠”条;所有栏都从y = 0开始。

为了让一个特定的情节显示在另一个面前,最简单的解决方案是情节是最后的,即在情景1中

p2 = plt.bar(ind, score_sim, width)
p1 = plt.bar(ind, score_feat, width)

除此之外,您可以使用zorder在另一个前面绘制一个地块。在剧情前面的zorder越高越好。

p1 = plt.bar(ind, score_feat, width, zorder=4)
p2 = plt.bar(ind, score_sim, width, zorder=3)
# p1 will be shown in front of p2, even though it is later defined, 
# because it has the larger zorder