перекрывающиеся столбчатые столбцы Python - PullRequest
0 голосов
/ 12 ноября 2018

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

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

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

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Один из способов сделать это - отсортировать столбцы индивидуально в каждом месте расположения столбцов:

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

0 голосов
/ 12 ноября 2018

Вам повезло!plot имеет zorder kwarg.

Я проверил его на 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

Редактировать:Я посмотрел на часть «бар в баре», и, как отмечалось в комментариях в другом месте, кажется, вам нужно будет вручную устанавливать 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()
...