2012-02-28 11 views
14

私はmatplotlibでカーブの下の領域を塗りつぶそうとしています。以下のスクリプトは正常に動作します。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)は、log(0) = -infinitylog(y)の間の領域を埋めるようにmatplotlibに指示します。当然、それはうんざりする。 01e-6のような小さな番号に変更することで、この問題を回避できます。

+0

もちろんです! 1e-6は小さすぎるかもしれませんが、plt.fill_between(x、y、1、color = '0.8')はうまくいきます! –

2

前述のように、0 -> -infは対数目盛である。したがって、ゼロ以下のプロットされた値は問題になります(ログ空間には無限のylimが必要です)。この問題は、fill_between()を使用しているかどうかに関係なく存在します。

幸いにも、matplotlibはこれをうまく処理する方法を提供します。デフォルトの動作では、matplotlibはすべての値の値を0以下にマスクします。この例では、y=0行全体がマスクされ、塗りつぶされた領域を定義するポリゴンから除外されます。その結果、(100,10)の行を下にして左に(0,0)に描画するだけで、ポリゴンが閉じられることになります。もう1つの方法は、値をクリップすることです。この場合、それらは1e-300に設定されており、プロットのylimを決定するときには参照されません。したがって、希望する結果を得るには、以下を実行してください:

plt.yscale('log', nonposy='clip') 
関連する問題