перекрывающиеся гистограммы Python с накоплением

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

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

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


person Thomas Owen Mazzetti    schedule 12.11.2018    source источник
comment
Вероятно, вам нужно вручную проверить, какой бар выше, и дважды запустить bar() с разными zorders для одного из классов.   -  person cheersmate    schedule 12.11.2018
comment
дааа. это становится экспоненциально более сложным с увеличением количества наборов данных для построения.   -  person Thomas Owen Mazzetti    schedule 12.11.2018
comment
Не обязательно. Если вы перебираете корзины и сортируете их одну за другой, это не должно быть слишком сложно. Однако обычно такой сюжет создается путем размещения столбцов рядом друг с другом.   -  person cheersmate    schedule 13.11.2018


Ответы (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()

который выглядит так:

введите здесь описание изображения

person cheersmate    schedule 13.11.2018
comment
О, это мило. Спасибо. - person Thomas Owen Mazzetti; 15.11.2018

Вам повезло! У 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)

Дает:

введите здесь описание изображения

И если я переверну это:

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)

введите здесь описание изображения

Редактировать: я просмотрел часть «полоса внутри полосы», и, как отмечалось в комментариях в другом месте, кажется, вам нужно будет вручную установить zorders на основе сортировки их значений. Вы, вероятно, захотите изменить ширину полосы на основе этого рассчитанного 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()
person Charles Landau    schedule 12.11.2018
comment
извините, я хотел сказать, что скрытое поведение нежелательно. Я хочу иметь возможность видеть оба набора данных, независимо от того, какой из них больше. - person Thomas Owen Mazzetti; 12.11.2018
comment
То есть бар в баре? В отличие от размещения баров рядом - person Charles Landau; 12.11.2018
comment
Я думаю, вы понимаете, чего я пытаюсь достичь. да - person Thomas Owen Mazzetti; 12.11.2018
comment
Отредактировано, чтобы ответить на это, но я не думаю, что вам это понравится ... есть ли причина, по которой вы не можете использовать шаблон параллельных полос? Кажется, гораздо проще реализовать - person Charles Landau; 12.11.2018
comment
бок о бок становится трудно читать, когда есть много x позиций - person Thomas Owen Mazzetti; 12.11.2018