2017-04-14 26 views
1

x軸の上下に部分的にある折れ線グラフがあります。0です。 ラインの上にあるすべての領域を緑色に塗りつぶすにはどうしたらいいですか?matplotlibグラフの塗りつぶし軸の上下2色

hydropathy_dict = {"I":-0.528, 
     "L":-0.342, 
     "F":-0.370, 
     "V":-0.308, 
     "M":-0.324, 
     "P":-0.322, 
     "W": -0.270, 
     "H": 2.029, 
     "T": 0.853, 
     "E": 3.173, 
     "Q": 2.176, 
     "C": 0.081, 
     "Y": 1.677, 
     "A":-0.495, 
     "S": 0.936, 
     "N": 2.354, 
     "D": 9.573, 
     "R": 4.383, 
     "G": 0.386, 
     "K": 2.101 
     } 
    seq = 'CHCRRSCYSTEYSYGTCTVMGINHRFCC' 
    hydropathy_list = [] 
    plot_x_axis = [] 
    for aa in seq: 
     hydropathy_list.append(hydropathy_dict[aa]) 
    print(acc,hydropathy_list) 
    for i in range(len(hydropathy_list)): 
     plot_x_axis.append(i) 

    plt.plot(plot_x_axis,hydropathy_list) 
    plt.plot([0,len(hydropathy_list)],[0,0]) 
    plt.show() 

答えて

2

これを試してみてください:

import matplotlib.pyplot as plt 
import numpy as np 
from scipy import interpolate 

hydropathy_dict = {"I":-0.528, 
     "L":-0.342, 
     "F":-0.370, 
     "V":-0.308, 
     "M":-0.324, 
     "P":-0.322, 
     "W": -0.270, 
     "H": 2.029, 
     "T": 0.853, 
     "E": 3.173, 
     "Q": 2.176, 
     "C": 0.081, 
     "Y": 1.677, 
     "A":-0.495, 
     "S": 0.936, 
     "N": 2.354, 
     "D": 9.573, 
     "R": 4.383, 
     "G": 0.386, 
     "K": 2.101 
     } 

seq = 'CHCRRSCYSTEYSYGTCTVMGINHRFCC' 
hydropathy_list = [] 
plot_x_axis = [] 
for aa in seq: 
    hydropathy_list.append(hydropathy_dict[aa]) 

#print(seq, hydropathy_list) 
for i in range(len(hydropathy_list)): 
    plot_x_axis.append(i) 

# convert to np array 
hydropathy_list = np.array(hydropathy_list) 
plot_x_axis = np.array(plot_x_axis) 

# densify data for filled color plot 
f = interpolate.interp1d(plot_x_axis, hydropathy_list) 
xnew = np.arange(plot_x_axis[0], plot_x_axis[-1], 0.1) 
ynew = f(xnew) 

plt.plot(plot_x_axis, hydropathy_list)  # blue line 
plt.plot([0, len(hydropathy_list)], [0,0]) # green line 

# use xnew, ynew to plot filled-color graphs 
plt.fill_between(xnew, 0, ynew, where=(ynew-1) < -1 , color='red') 
plt.fill_between(xnew, 0, ynew, where=(ynew-1) > -1 , color='green') 

plt.show() 

with interpolated points

編集(コメントでの質問の応答で)

ステートメントwhere=(ynew-1)<-1の内部にはfill_between()があり、numpyの配列としてynewが必要です(単純なリストは機能しません)。

Scipy.interpolate()は、カーブに沿ってより多くの点を取得するために使用されるため、色はターゲット領域を完全に塗りつぶします。

with original points

+0

他のコメントがあっても、私はそれを完全に動作させることはできませんでした。補間とnumpyの配列が必要ですか、それともmatplotlibの解もありますか? – RnRoger

+0

@RnRoger、いくつかの質問を明確にするために私の答えを編集しました。曲線の密度の高い点を得るために、データの各セグメントに対して 'np.arange()'を使用し、それらの 'np.concaternate()'を使用することもできます。それでも問題が解決しない場合は、いつでも新しい質問として投稿できます。 – swatchai

0

使用この形式:

import matplotlib.pyplot as plt 

x = range(10) 
plt.fill_between(x,0,100,color='red') 
plt.fill_between(x,0,-100,color='blue') 

plt.show() 
1

matplotlib fill-between demoを見てみましょう ここでは、コードです。それは確かにあなたの質問に答えます。

しかし、あなたのコードにはこれをより難しくするような数字の定義はありません。通常は、次の手順を実行します

fig, ax = plt.figure() 
ax.plot(plot_x_axis, line_1) 
ax.plot(plot_x_axis, line_2) 
ax.fill_between(plot_x_axis, line_1, line_2, color='r') 
ax.fill_between(plot_x_axis, line_2, line_1, color='g') 
+0

なぜ私は数字を使用する必要があります。元の点で

、結果は次のようになりますか?この場合、それは良いですか? – RnRoger

+1

プロット作業がはるかに簡単になり、複数のプロットが必要な場合は、プロット間の曖昧性を排除します。また、Figureを持つ複数のAxesが必要な場合は、これが必要です。 – Grr

関連する問題