Почему бары ошибок на графике шкалы matplotlib с логарифмической шкалой являются односторонними? - PullRequest
2 голосов
/ 03 июня 2019

Я пытаюсь построить несколько гистограмм, где каждое значение y усредняется по некоторым сериям.Следовательно, я также пытаюсь добавить полосы ошибок (стандартные отклонения) для каждого бара.

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

Here is a link to the plot

Я проверил, и ошибочные полосы направления + верны, просто не уверен, почему / как они опускаются до x-ось изредка.Ниже приведен упрощенный пример.

y = [99.79999999999997, 0.11701249999999999, 0.00011250000000000004, 0.013393750000000001,0.007743750000000001,
   0.01, 0.033906250000000006, 0.0009687500000000002, 0.04187500000000001, 0.0218, 0.0018062499999999997, 0.0005187500000000001]
std =[0.013662601021279521, 0.1500170651403811, 3.4156502553198664e-05, 0.001310709095617076,0.0006239324215543433,
   0.0, 0.0021671698133741164,0.0018750000000000001, 0.005302515126491074,0.007984401459512583,0.0006297817082132506,4.0311288741492725e-05]

plt.figure()  # Powder plot
plt.bar(np.arange(len(y)), y, yerr=std)
plt.yscale('log')

'key_list' - это просто список строк, которые станут метками x-tick.'width' - это смещение полосы, чтобы соответствовать парам.«cm» и «kk» - это просто словари списков.Честно говоря, это похоже на проблему с рендерингом, но мне очень любопытно, сталкивался ли кто-нибудь из вас с этим.

1 Ответ

0 голосов
/ 03 июня 2019

Как уже упоминалось в комментарии, это потому, что ваш std больше y (например, std[1] > y[1], следовательно, шкала log становится банановой. Вы можете исправить , введямалый допуск к нижнему std:

tor = 1e-9
lower_std = [a - tor if a<b else b for a,b in zip(y,std)]

plt.figure()
plt.bar(np.arange(len(y)), y, yerr=(lower_std,std))
plt.yscale('log')
plt.show()

Выход:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...