重叠的python堆叠条形图

时间:2018-11-12 19:56:22

标签: python matplotlib bar-chart overlap z-order

是否可以在每个x位置的多个条形图中将每个数据集的zorder设置为不同,以便所有信息可见。

axes.bar(position,data_1,color='g')
axes.bar(position,data_2,color='r')
axes.bar(position,data_3,color='b')

例如,如果蓝色值大于绿色值,则绿色将被隐藏,反之亦然。将alpha设置为比1更低的值会通过混合颜色显示超过3种颜色。

3 个答案:

答案 0 :(得分:2)

一种方法是在每个酒吧位置分别对酒吧进行排序:

import matplotlib.pyplot as plt
import numpy as np

L = 5

heights_a = 10. + np.random.randn(L)
heights_b = 10. + np.random.randn(L)
heights_c = 10. + np.random.randn(L)

position = np.arange(L)
colors = ['C0', 'C1', 'C2']

plt.figure()

for x, ha, hb, hc in zip(position, heights_a, heights_b, heights_c):
    for i, (h, c) in enumerate(sorted(zip([ha, hb, hc], colors))):
        plt.bar(x, h, color=c, zorder=-i)

plt.show()

如下所示:

enter image description here

答案 1 :(得分:2)

我没有足够的声誉来发表评论,但是当高度(例如,海平面以上/以下的高度)为负值时,@ cheersmate的解决方案需要稍作修正。通过按高度的绝对值排序可以很容易地解决此问题:

for x, ha, hb, hc in zip(position, heights_a, heights_b, heights_c):
    for i, (h, c) in enumerate(sorted(zip([ha, hb, hc], colors), key=lambda (h,c): (abs(h), c))):
        plt.bar(x, h, color=c, zorder=-i)

答案 2 :(得分:1)

您很幸运! plot有一个zorder矮人。

为了确定这一点,我使用了一个例子在bar上进行了测试。

summer = ax.bar(index, df["Crime Type Summer"].value_counts(), bar_width,
                label="Summer", zorder=2)

winter = ax.bar(index, df["Crime Type Winter"].value_counts(),
                bar_width, label="Winter", zorder=1)

礼物:

enter image description here

如果我撤消它:

summer = ax.bar(index, df["Crime Type Summer"].value_counts(), bar_width,
                label="Summer", zorder=1)

winter = ax.bar(index, df["Crime Type Winter"].value_counts(),
                bar_width, label="Winter", zorder=2)

enter image description here

编辑:我调查了“条形图内”的部分,并且正如其他注释中所指出的那样,似乎您需要根据其值的排序手动设置zorder。您可能需要根据所计算的zorder修改条形宽度,以获得视觉效果。

为清楚起见,下面给出了我用作参考示例的完整代码:

import random
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

s = "Crime Type Summer|Crime Type Winter".split("|")
j = {x: [random.choice(["ASB", "Violence", "Theft", "Public Order", "Drugs"]) for j in range(300)] for x in s}
df = pd.DataFrame(j)

index = np.arange(5)
bar_width = 0.35

fig, ax = plt.subplots()
summer = ax.bar(index, df["Crime Type Summer"].value_counts(), bar_width,
                label="Summer", zorder=1)

winter = ax.bar(index, df["Crime Type Winter"].value_counts(),
                bar_width, label="Winter", zorder=2)

ax.set_xlabel('Category')
ax.set_ylabel('Incidence')
ax.set_title('Crime incidence by season, type')
ax.set_xticks(index)
ax.set_xticklabels(["ASB", "Violence", "Theft", "Public Order", "Drugs"])
ax.legend()

plt.show()