Как построить две гистограммы со сложенными столбцами, не складывая все столбцы вместе?

У меня есть 4 гистограммы, скажем, A, B, C и D. Я хотел бы построить гистограммы A и B вместе, со сложенными столбцами, а также с гистограммами C и D, также со сложенными столбцами, но без складывания четырех гистограмм вместе. Итак, я хотел бы две гистограммы с накоплением в одной гистограмме с расположенными рядом столбцами.

Пока что я могу построить либо A-B-C-D со сложенными столбцами; или AB и C-D на разных гистограммах с накоплением, но столбцы обеих гистограмм не расположены рядом. это код, который у меня есть:

plot=[A,B,C,D] #values from 0-10
ww=[wA,wB,wC,wD] #weights

Все бары сложены:

plt.hist(plot,bins=10,weights=ww,label=['A','B','C','D'],histtype = "barstacked")

Гистограмма AB + гистограмма C-D, но одна гистограмма скрывает другую:

plt.hist(plot[0:2],bins=10,weights=ww[0:2],label=['loses','wins'],stacked=True)
plt.hist(plot[2:4],bins=10,weights=ww[2:4],label=['l','w'],stacked=True)

Заранее спасибо за вашу помощь!

Какую библиотеку Python вы вообще используете? сюжет?

Tacocat 14.06.2019 09:46
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
88
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

вы можете использовать список патчей, который возвращает hist():

import numpy as np
import matplotlib.pyplot as plt
A = np.arange(100)
B = np.arange(100)
C = np.arange(100)
D = np.arange(100)

wA = np.abs(np.random.normal(size=100))
wB = np.abs(np.random.normal(size=100))
wC = np.abs(np.random.normal(size=100))
wD = np.abs(np.random.normal(size=100))

plot=[A,B,C,D] #values from 0-10
ww=[wA,wB,wC,wD] #weights

n, bins, patches = plt.hist(plot[0:2],bins=10,weights=ww[0:2],label=['loses','wins'],stacked=True)
n, bins, patches2 = plt.hist(plot[2:4],bins=10,weights=ww[2:4],label=['l','w'],stacked=True)

for patch in patches:
    plt.setp(patch, 'width', 10)
for patch in patches2:
    plt.setp(patch, 'width', 5)    

plt.show()

histogram

Обновить

Я узнал, что есть гораздо лучший и более чистый способ сделать это:

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)

# the data
A = np.arange(10)
B = np.arange(10)
C = np.arange(10)
D = np.arange(10)

wA = np.abs(np.random.normal(size=10))
wB = np.abs(np.random.normal(size=10))
wC = np.abs(np.random.normal(size=10))
wD = np.abs(np.random.normal(size=10))
## necessary variables
width = 0.5                      # the width of the bars
## the bars
rects1 = ax.bar(A - width/2, wA, width,
                color='blue')
rects2 = ax.bar(B- width/2, wB, width, bottom=wA,
                color='green')
rects3 = ax.bar(C + width/2, wC, width,
                color='red')
rects4 = ax.bar(D + width/2, wD, width, bottom=wC,
                color='yellow')
# axes and labels
ax.set_xlim(-width,len(A)+width)

plt.show()

результаты это: better histogram

для получения более подробной информации см. эта ссылка.

Спасибо, почти! В этом случае мы по-прежнему везде видим оранжевый цвет, тогда как я ожидал увидеть, например, только зелено-красный (например, A-B) и столбцы сине-оранжевого цвета (например, C-D). Есть ли способ установить не только «ширину», но, например, «начальную точку»? Это может решить проблему. Моя идея состоит в том, чтобы сравнить гистограмму с накоплением AB с гистограммой с накоплением C-D, поэтому я бы хотел, чтобы оранжевый цвет находился поверх зелено-красного, если это возможно. Есть идеи?

sac 14.06.2019 11:38

Итак, я провел еще несколько исследований, и есть лучший способ сделать это, и он делает то, что вы только что описали. Надеюсь, поможет. ваше здоровье ;)

Bahman Rouhani 14.06.2019 12:04

Замечательно!! Большое спасибо!!

sac 15.06.2019 11:18

Другие вопросы по теме