Отсутствие ошибок при использовании 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 становится отрицательным, значения &lt = 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 = 'клип' по умолчанию для осей осей журнала.