Заполнить область под кривой в питоне matlibplot в логарифмическом масштабе - PullRequest
14 голосов
/ 29 февраля 2012

Я пытаюсь заполнить область под кривой с помощью matplotlib. Сценарий ниже работает нормально.

import matplotlib.pyplot as plt
from math import sqrt
x = range(100)
y = [sqrt(i) for i in x]
plt.plot(x,y,color='k',lw=2)
plt.fill_between(x,y,0,color='0.8')
plt.show()

Однако, если я установлю шкалу y на логарифмическую (см. Ниже). Иногда он заполняет область над кривой! Может кто-нибудь мне помочь? Я хотел бы заполнить область между кривой и у = 0.

x = range(100)
y = [sqrt(i) for i in x]
plt.plot(x,y,color='k',lw=2)
plt.fill_between(x,y,0,color='0.8')
plt.yscale('log')
plt.show()

Заранее спасибо!

Ответы [ 2 ]

13 голосов
/ 29 февраля 2012

С логарифмической шкалой y, fill_between(x, y, 0) указывает matplotlib заполнить область между log(0) = -infinity и log(y).Естественно, это мешает.Вы можете избежать этой проблемы, изменив 0 на небольшое число, например 1e-6.

2 голосов
/ 22 ноября 2012

Как уже упоминалось, 0 -> -inf в логарифмическом масштабе.Таким образом, любое построенное значение, которое было бы меньше или равно нулю, было бы проблематично (требуя бесконечного ylim в лог-пространстве).Эта проблема существует независимо от того, используете ли вы fill_between () или нет.

К счастью, matplotlib предоставляет способ справиться с этим.В поведении по умолчанию matplotlib маскирует значения каждого значения, меньшего или равного нулю.В вашем примере это означает, что вся ваша линия y=0 замаскирована и исключена из многоугольника, определяющего заполненную область между ними.В результате полигон просто закрывается, рисуя линию от (100,10) вниз и влево до (0,0).Другой вариант - обрезать значения.В этом случае они установлены на 1e-300 и не учитываются при определении яркости графика.Таким образом, чтобы получить желаемый результат, выполните следующие действия:

plt.yscale('log', nonposy='clip')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...