Как можно индивидуально указать цвета в столбце гистограммы с накоплением matplotlib? - PullRequest
1 голос
/ 08 октября 2019

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

Таким образом, для классов сигнала и фона этих данных, классифицированных как сигнал, большинство из них правильные, но некоторые данныена самом деле являются фоновыми, и из этих данных, классифицированных как фоновые, большинство из них верны, но некоторые данные фактически являются сигнальными. Теперь это означает, что я хочу построить одну полосу для сигнала и чтобы сигнал (красный) составлял большую часть полосы, а фон (синий) составлял меньшую часть полосы, и я хочу построить еще одну полосу для фона ичтобы фон (синий) составлял большую часть полосы, а сигнал (красный) составлял меньшую часть полосы.

У меня есть следующий код, но порядок цветов во второй полосе (фон)нужно поменять местами. Как это может быть сделано? (Я также думаю о возможности иметь более двух классов.)

import matplotlib
import matplotlib.pyplot as plt

%matplotlib inline
plt.rcParams["figure.figsize"] = [10, 10]

cc0 = 39695 # classified correctly background
ci0 = 18595 # classified incorrectly background
cc1 = 38801 # classified correctly signal
ci1 = 19556 # classified incorrectly signal

fractions_correct   = (cc0, cc1)
fractions_incorrect = (ci0, ci1)
width = 0.9
ind   = np.arange(2)
p1    = plt.bar(ind, fractions_correct, width, color='red')
p2    = plt.bar(ind, fractions_incorrect, width, bottom=fractions_correct, color='blue')

plt.xlabel('classification by model')
plt.ylabel('class case abundances')
plt.xticks(ind, ('signal', 'background'))
plt.yticks([])
plt.legend((p2[0], p1[0]), ('background', 'signal'), loc='center left', bbox_to_anchor=(1, 0.5));
plt.show()

Ответы [ 2 ]

2 голосов
/ 08 октября 2019

Вы можете передать цветной список параметров, если длина списка соответствует количеству баров.

    color=["red","blue"]
    p1    = plt.bar(ind, fractions_correct, width, color=color)
    color=["blue","red"]
    p2 = plt.bar(ind, fractions_incorrect, width, bottom=fractions_correct, color=color)
1 голос
/ 08 октября 2019

Самое быстрое решение для этого было бы добавить список цветов, которые будут отображены на графике:

p1    = plt.bar(ind, fractions_correct, width, color=['red','blue'])
p2    = plt.bar(ind, fractions_incorrect, width, bottom=fractions_correct, color=['blue','red'])

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

...