Как добавить четвертый столбец в групповой диаграмме, используя matplotlib и seaborn в Python? - PullRequest
1 голос
/ 24 июня 2019

Я пытаюсь создать групповую диаграмму, чтобы показать точность, точность, отзыв и оценки f1, достигнутые различными классификаторами машинного обучения.Гистограмма группы работает нормально, когда я использую три бара для каждого классификатора, но выглядит странно, когда я добавляю четвертый.В частности, разрыв между стержнями исчезает, и четвертый столбец перекрывается с другими стержнями.Вот как это выглядит, когда я использую три бара:

enter image description here

, и это выглядит, когда я пытаюсь добавить четвертый:

enter image description here

N = 9
ind = np.arange(N)  # location of groups
width = 0.27       # width of bars

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

rects1 = ax.bar(ind, Precision, width, color='r')

rects2 = ax.bar(ind+width, Recall, width, color='g')

rects3 = ax.bar(ind+width*2, F1, width, color='b')

rects4 =  ax.bar(ind+width*3, Accuracy, width, color='y')

ax.set_ylabel('Scores')
ax.set_xticks(ind+width)
ax.set_xticklabels(Model,rotation=90)
ax.legend( (rects1[0], rects2[0], rects3[0]), ('Precision', 'Recall','F1 Score') )

def autolabel(rects):
    for rect in rects:
        h = rect.get_height()
        ax.text(rect.get_x()+rect.get_width()/2., 1.05*h, '%d'%int(h*100),
                ha='center', va='bottom')

autolabel(rects1)
autolabel(rects2)
autolabel(rects3)
autolabel(rects4)

fig_size = plt.rcParams["figure.figsize"]
fig_size[0] = 20
fig_size[1] = 15
plt.rcParams["figure.figsize"] = fig_size

plt.show()

Я новичок в Python, поэтому любая помощь будет высоко ценится.

1 Ответ

2 голосов
/ 24 июня 2019

Проблема в том, что ваш текущий интервал равен 0,27. Если у вас 4 бара, это приводит к интервалу 0,27 * 4 = 1,08, тогда как соответствующие столбцы расположены на расстоянии 1. В результате ваши бары начинают перекрываться.

Одно из жестко закодированных решений - заменить 0,27 чем-то меньшим, например 0,2. Это оставит интервал 1-0,2 * 4 = 0,2 между соседними стержнями.

Другим разумным решением было бы вычислить интервал в зависимости от количества баров, используя что-то вроде spacing = 1/(nbars+1), где +1 - добавить дополнительное пространство

P.S .: Пользователи Python 2 , на что указывает @ Leporello

Использование spacing = 1.0/(nbars+1)

...