Отсутствие ошибок при использовании yscale ('log') в matplotlib
В некоторых случаях matplotlib показывает график с ошибками ошибочно при использовании логарифмической шкалы.
Предположим, что эти данные (например, в pylab):
s=[19.0, 20.0, 21.0, 22.0, 24.0]
v=[36.5, 66.814250000000001, 130.17750000000001, 498.57466666666664, 19.41]
verr=[0.28999999999999998, 80.075044597909169, 71.322124839818571, 650.11015891565125, 0.02]
errorbar(s,v,yerr=verr)
и я получаю нормальный результат, но когда я переключаюсь на логарифмический масштаб:
yscale('log')
Я получаю график, в котором некоторые ошибки не видны, хотя вы все еще можете видеть некоторые из ошибок. (См. Ниже.) Почему это происходит и как я могу это исправить?
![log plot example]()
Ответы
Ответ 1
Проблема в том, что для некоторых точек v-verr
становится отрицательным, значения < = 0 не могут быть показаны на логарифмической оси (log(x)
, x<=0
is undefined). Чтобы обойти это, вы можете использовать асимметричный ошибок и заставить результирующие значения быть выше нуля для очков нарушения.
В любой точке, для которой ошибки больше значения verr>=v
, мы присваиваем verr=.999v
, в этом случае панель ошибок будет близка к нулю.
Вот script
import matplotlib.pyplot as plt
import numpy as np
s=[19.0, 20.0, 21.0, 22.0, 24.0]
v=np.array([36.5, 66.814250000000001, 130.17750000000001, 498.57466666666664, 19.41])
verr=np.array([0.28999999999999998, 80.075044597909169, 71.322124839818571, 650.11015891565125, 0.02])
verr2 = np.array(verr)
verr2[verr>=v] = v[verr>=v]*.999999
plt.errorbar(s,v,yerr=[verr2,verr])
plt.ylim(1E1,1E4)
plt.yscale('log')
plt.show()
Вот результат
![Logarithmic plot with error bars]()
Ответ 2
Переключитесь в логарифмическую шкалу, но с помощью этой команды:
plt.yscale('log', nonposy='clip')
Аналогично, для оси x:
plt.xscale('log', nonposx='clip')
В любом случае, если у вас есть dev-версия matplotlib за последние полгода, вы будете иметь это поведение отсечения по умолчанию, как описано в Сделать nonposy = 'клип' по умолчанию для осей осей журнала.