2012-02-28 2 views
14

Я пытаюсь заполнить область под кривой matplotlib. Скрипт ниже работает отлично.Заполнить область под кривой в python matlibplot на шкале журнала

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 (см. Ниже). Он иногда заполняет область над кривой! Может кто-нибудь мне помочь? Я хотел бы заполнить область между кривой и 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() 

Заранее благодарим за внимание!

ответ

13

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

+0

Конечно! 1e-6 может быть слишком маленьким, но plt.fill_between (x, y, 1, color = '0.8') отлично работает! –

2

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

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

plt.yscale('log', nonposy='clip') 
Смежные вопросы