Matplotlib — полосы ошибок не центрированы по точкам

#python #matplotlib

#python #matplotlib

Вопрос:

Я знаю, что это было проблемой раньше в matplotlib — но это должно было быть исправлено, верно?

Когда я выполняю. мой пример кода для точечной диаграммы:

 %matplotlib inline
import matplotlib.pyplot as plt
plt.style.use('seaborn-whitegrid')
import numpy as np


plt.xlabel(r'$Label , in , Latex$')
plt.ylabel(r'$Label , in , Latex$')
plt.title(r'$Title , in , Latex$')
#plt.text(1, 15, r'$Latex , Example , Text$')

x=[1, 2, 3, 4]
y=[1, 4, 9, 16]


plt.axis([0, 6, 0, 20])
plt.errorbar(x, y, yerr=1, fmt='.k', capsize=3)
plt.savefig('foo.pdf', bbox_inches="tight")
  

полосы ошибок не центрированы по точкам. Я использую matplotlib 3.02 — Anaconda почему-то не распознает, что там 3.03.

Ответ №1:

Я нашел следующий обходной путь: указание linewidth=1 для строки ошибок делает их центрированными. Я попробовал несколько значений, и все, что ниже 1.5, работает по центру, но все, что выше 1.5 (включительно), смещает его от центра. Я не знаю причины. Это может быть связано с dpi

 import matplotlib.pyplot as plt
plt.style.use('seaborn-whitegrid')
import numpy as np

plt.xlabel(r'$Label , in , Latex$')
plt.ylabel(r'$Label , in , Latex$')
plt.title(r'$Title , in , Latex$')
#plt.text(1, 15, r'$Latex , Example , Text$')

x=[1, 2, 3, 4]
y=[1, 4, 9, 16]

plt.axis([0, 6, 0, 20])
plt.errorbar(x, y, yerr=1, lw=1, fmt='.k', capsize=3)
  

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

Ответ №2:

Сохранение как .svg решает проблему для меня. При использовании jupyter notebook график отображается с нецентрированными полосами ошибок, но он сохранен правильно.

 import matplotlib.pyplot as plt
plt.style.use('seaborn-whitegrid')
import numpy as np

plt.xlabel(r'$Label , in , Latex$')
plt.ylabel(r'$Label , in , Latex$')
plt.title(r'$Title , in , Latex$')
#plt.text(1, 15, r'$Latex , Example , Text$')

x=[1, 2, 3, 4]
y=[1, 4, 9, 16]

plt.axis([0, 6, 0, 20])
plt.errorbar(x, y, yerr=1, lw=2, fmt='o', capsize=3)

plt.savefig('TEST.svg', bbox_inches='tight', format='svg')