Как разделить и сложить столбцы в гистограмме, только штрихуя нижние столбцы? - PullRequest
2 голосов
/ 18 января 2020

Представьте, что у меня есть следующие 6 массивов:

A0 = np.array([0,2,5,6,3,1,9,3,5,7])
B0 = np.array([5,1,6,7,3,8,2,3,4,7,1])
C0 = np.array([3,5,7,7,8,5,5,6,7,1,6])

A1 = np.array([2,2,6,7,4])
B1 = np.array([1,6,1,4,0])
C1 = np.array([5,3,3,7,0])

Я мог бы построить первые три в гистограмме, разделив три массива на три маленьких столбца (синий для A0, желтый для B0 и зеленый для C0).

plt.hist([A0,B0,C0])
plt.show()

Я также мог бы составлять гистограммы двух массивов; например,

plt.hist([A0,A1], stacked=True)
plt.show()

Link to a sketch of the two above histograms

Теперь я могу sh объединить эти два эффекта: я хотел бы создать гистограмму, которая отображает массивы A0, B0 и C0 отдельно в эти меньшие столбцы, и тогда я хотел бы, чтобы гистограммы массивов A1, B1 и C1 были сложены поверх гистограмм A0, B0 и C0 соответственно.

Предпочтительно, я также хотел бы иметь массивы A1, B1 и C1 должны быть заштрихованы, например,

plt.hist(A1, hatch='//')

, в то время как A0, B0 и C0 просто регулярно заполнены и не заштрихованы.

1 Ответ

1 голос
/ 19 января 2020

Один из подходов - сначала нарисовать разделенную гистограмму для [A0+A1, B0+B1, C0+C1]. Эти столбики будут иметь такую ​​же высоту, как и столбцы с накоплением. Затем за второй проход гистограмма разделения для [A1, B1, C1] рисуется в том же месте. Важно, чтобы в обоих случаях использовались одинаковые bins. Обратите внимание, что этот подход не будет работать для гистограммы «плотности».

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

import numpy as np
from matplotlib import pyplot as plt

A0 = np.array([0,2,5,6,3,1,9,3,5,7])
B0 = np.array([5,1,6,7,3,8,2,3,4,7,1])
C0 = np.array([3,5,7,7,8,5,5,6,7,1,6])
A1 = np.array([2,2,6,7,4])
B1 = np.array([1,6,1,4,0])
C1 = np.array([5,3,3,7,0])

# bar_colors = ['C0', 'C1', 'C2']
bar_colors_0 = plt.cm.tab20c.colors[0:12:4]
bar_colors_1 = plt.cm.tab20c.colors[1:12:4]

_, bins, _ = plt.hist([np.concatenate([A0, A1]),np.concatenate([B0, B1]),np.concatenate([C0, C1])], color=bar_colors_0)

plt.hist([A1,B1,C1], bins=bins, hatch='//', color=bar_colors_1)

plt.show()

resulting plot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...