AssertionError при вставке панелей ошибок - PullRequest
0 голосов
/ 10 ноября 2019

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

Curtailment_Herrenhof_A     = 12210
Curtailment_Herrenhof_B     = 22170
Curtailment_Herrenhof_data  = 8896
std = 2000



plt.figure
plt.bar('eff avg', Curtailment_Herrenhof_A, width = 0.5, label='Method A')
plt.bar('none', Curtailment_Herrenhof_B, width = 0.5, label='Method B')
plt.bar('wind avg', Curtailment_Herrenhof_data, width = 0.5, label='Measured data')
plt.errorbar('eff avg', Curtailment_Herrenhof_A, yerr= std, marker='o', fmt='') 
plt.ylabel('Durtaion of curtailment measures [min]', fontsize=12)
plt.legend(bbox_to_anchor=(-0.018, 1.2), loc='upper left', ncol=3)
plt.xticks([])
plt.tight_layout()
plt.savefig('Curtailment_Wirdum_time.png')
plt.show()

с ошибкой:

  File "C:/Users/Elias/Anaconda3/Scripts/Masterarbeit/plotten.py", line 213, in <module>
    plt.errorbar('eff avg', Curtailment_Herrenhof_A, yerr= std, marker='o', fmt='')

  File "C:\Users\Elias\Anaconda3\lib\site-packages\matplotlib\pyplot.py", line 2991, in errorbar
    **kwargs)

  File "C:\Users\Elias\Anaconda3\lib\site-packages\matplotlib\__init__.py", line 1867, in inner
    return func(ax, *args, **kwargs)

  File "C:\Users\Elias\Anaconda3\lib\site-packages\matplotlib\axes\_axes.py", line 3324, in errorbar
    xo, _ = xywhere(x, lower, noylims & everymask)

  File "C:\Users\Elias\Anaconda3\lib\site-packages\matplotlib\axes\_axes.py", line 3225, in xywhere
    assert len(xs) == len(ys)

AssertionError

Так что, похоже, есть какая-то ошибка измерения, которую я действительно не получаю? Я только пытаюсь построить целые числа, поэтому я не вижу проблемы ..

Может быть, кто-то может указать мне правильное направление?

Ответы [ 2 ]

0 голосов
/ 10 ноября 2019

Проблема в том, что строка (например, "abcde") может интерпретироваться как список символов (["a", "b", ...]). Поэтому он также имеет длину. Тем не менее, вы хотите обработать всю строку как один элемент списка, чтобы иметь возможность вывести ее на другое значение. Поэтому вместо plt.bar("my string", 100) вы бы хотели поместить эту строку в список с одним элементом.

plt.bar(["my string"], 100)

Ваш полный код:

Curtailment_Herrenhof_A     = 12210
Curtailment_Herrenhof_B     = 22170
Curtailment_Herrenhof_data  = 8896
std = 2000

import matplotlib.pyplot as plt
plt.figure()
plt.bar(['eff avg'], Curtailment_Herrenhof_A, width = 0.5, label='Method A')
plt.bar(['none'], Curtailment_Herrenhof_B, width = 0.5, label='Method B')
plt.bar(['wind avg'], Curtailment_Herrenhof_data, width = 0.5, label='Measured data')
plt.errorbar(['eff avg'], Curtailment_Herrenhof_A, yerr= std, marker='o', fmt='') 
plt.ylabel('Durtaion of curtailment measures [min]', fontsize=12)
plt.legend(bbox_to_anchor=(-0.018, 1.2), loc='upper left', ncol=3)

plt.tight_layout()
plt.savefig('Curtailment_Wirdum_time.png')
plt.show()

enter image description here

0 голосов
/ 10 ноября 2019

Почему вы везде передаете строки в качестве первых аргументов? Например, pyplot.bar ожидает, что его первый аргумент будет «последовательностью скаляров», а не строкой. То же самое для errorbar.

Вы получаете эту конкретную ошибку, потому что здесь:

plt.errorbar('eff avg', Curtailment_Herrenhof_A, ...)

Вы пытаетесь построить строку (!) 'eff avg' против одного числа Curtailment_Herrenhof_A, поэтому где-то внутри matplotlib, xs == 'eff avg' и ys == [12210]. Конечно, len('eff avg') != len([12210]), поэтому вы получите ошибку.

Кроме того, plt.figure ничего не делает. Это функция , и она должна вызываться , чтобы действительно что-то делать.

...