2017-04-14 51 views
1

我有一个线图,部分在0的x轴的上方和下方。 如何为线条上方的所有区域着色绿色,并且全部在红色下方? 下面的代码: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()需要ynew作为一个numpy数组(简单的列表不起作用)。

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

它使情节工作更容易,如果你想要多个地块,它们之间消除歧义。另外如果你需要一个数字的多轴,这是必要的。 – Grr