Построение нескольких столбцов на диаграмме с помощью MatPlotLib

#python #matplotlib

#python #matplotlib

Вопрос:

Я пытаюсь создать столбчатую диаграмму, как показано ниже:

гистограмма

Где каждый месяц по оси X имеет три уникальных значения, однако при запуске моего кода я получаю следующую ошибку:

Трассировка (последний последний вызов): Файл «/tmp/sessions/6a06aeb1410cb532/main.py «, строка 12, в rects1 = ax.bar(ind, yvals, width, color=’r’) Файл «/usr/local/lib/python3.6/dist-packages/matplotlib/init.py «, строка 1867, во внутреннем файле функции возврата (ax, *args, **kwargs) «/usr/local/lib/python3.6/dist-packages/matplotlib/axes/_axes.py «, строка 2238, в строке np.atleast_1d(x), высота, ширина, y, ширина строки) файла «/usr/local/lib/python3.6/dist-packages/numpy/lib/stride_tricks.py «, строка 252, в broadcast_arraysФайл shape = _broadcast_shape(* args) «/usr/local/lib/python3.6/dist-packages/numpy/lib/stride_tricks.py «, строка 187, в _broadcast_shape b = np.broadcast(* args[:32]) Ошибка значения: несоответствие формы: объекты не могут быть переданы в одну фигуру


Вот код, в котором я использую

 import numpy as np
import matplotlib.pyplot as plt

N = 3
ind = np.arange(N)  # the x locations for the groups
width = 0.27       # the width of the bars

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

yvals = [1128, 902, 788, 431, 536, 925, 1001, 853, 1115, 1059, 685, 876]
rects1 = ax.bar(ind, yvals, width, color='r')

zvals = [2500,2085, 1931, 1147, 1218, 2056, 1943, 1805, 2218, 2427, 1467, 1966]
rects2 = ax.bar(ind width, zvals, width, color='g')

kvals = [1042,847,764, 464, 483, 757, 842, 724, 958, 902, 668, 847]
rects3 = ax.bar(ind width*2, kvals, width, color='b')

ax.set_ylabel('Average traffic count')
ax.set_xticks(ind width)
ax.set_xticklabels( ('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December') )
 ax.legend( (rects1[0], rects2[0], rects3[0]), ('London Road', 'Norwich Road', 'Foxhall Road') )

 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),
            ha='center', va='bottom')

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

plt.show()
 

Буду признателен за любую помощь в определении причины и устранении этой ошибки.

Комментарии:

1. N был основным виновником сбоя вашего кода

Ответ №1:

Основной причиной сбоя вашего кода было N значение. Поскольку вы рассматриваете значения за 12 месяцев (или точки данных), ваше значение N должно быть равно 12. Проверьте приведенный ниже код

 import numpy as np
import matplotlib.pyplot as plt

N = 12
ind = np.arange(N)  # the x locations for the groups
W = 0.27       # the width of the bars

fig = plt.figure(figsize=(30,10))
ax = fig.add_subplot(111)

yvals = [1128, 902, 788, 431, 536, 925, 1001, 853, 1115, 1059, 685, 876]
rects1 = ax.bar(ind, yvals, width=W, color='r')

zvals = [2500,2085, 1931, 1147, 1218, 2056, 1943, 1805, 2218, 2427, 1467, 1966]
rects2 = ax.bar(ind W, zvals, width=W, color='g')

kvals = [1042,847,764, 464, 483, 757, 842, 724, 958, 902, 668, 847]
rects3 = ax.bar(ind W*2, kvals, width=W, color='b')

ax.set_ylabel('Average traffic count')
ax.set_xticks(ind W)
ax.set_xticklabels( ('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December') )
ax.legend( (rects1[0], rects2[0], rects3[0]), ('London Road', 'Norwich Road', 'Foxhall Road') )

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

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

plt.show()
 

И с помощью better figsize вы можете добиться такого чистого вывода:
введите описание изображения здесь

Ответ №2:

Настройка N=12 (количество точек данных в трех наборах данных) дает

введите описание изображения здесь

Это то, что вы ищете?