2017-04-22 23 views
1

したがって、同じx値で複数の曲線を定義していますが、y値は異なります。下の画像は21種類の曲線から構成されています。それらのうちの10個は点線であり、1は実線であり、最後の10は破線である。プロット内のカーブ間の網掛け領域

しかし、画像に見られるように、それはむしろ1つのグラフにあります。あなたは本当にどこに何があるのか​​を見ることはできません。だから、私が望むのは、最初の10行と最後の10行の間に陰影のある領域があることです。

しかし、私はどのように開始するのかよく分かりません。以下のように、それは今私のコードであるため

です:あなたが最小限であるかを表す配列を決定するために必要な複数の曲線の最小値と最大値の間を埋めるために

import os 
import numpy as np 
import matplotlib.pyplot as plt 

structures = ['Rectum'] 
patients = ["426"] 

color_map = 'nipy_spectral' 
color = {'PTV':0.16, 'Rectum':0.80, 'Bladder':0.96} 

legends = ['PTV', 'Rectum', 'Bladder'] 

x = np.loadtxt('dose_gy.txt') 


for plot, patient in enumerate(patients): 
    plot += 1 
    PATH_TO_YDATA = 'results/Two_Fields/DVH' 
    for f in sorted(os.listdir(PATH_TO_YDATA), key=lambda f: f.split('_')[-2]): 
     if f.split('_')[-2] == patient: 
      for structure in structures: 
       if f.split('_')[2] == structure: 
        y = np.loadtxt(PATH_TO_YDATA + '/' + f) 
        plt.axis([0, 90, 0, 50]) 
        if int(f.split('_')[-1][:-4]) < 90: 
         plt.plot(x, y * 100, color=plt.get_cmap(color_map)(color[structure]), linestyle='dotted', alpha=0.8, linewidth=2.0) 
        elif int(f.split('_')[-1][:-4]) > 90: 
         plt.plot(x, y * 100, color=plt.get_cmap(color_map)(color[structure]), linestyle='dashed', alpha=0.8, linewidth=2.0) 
        elif int(f.split('_')[-1][:-4]) == 90: 
         plt.plot(x, y * 100, color=plt.get_cmap(color_map)(color[structure]), linestyle='solid', alpha=1.0, linewidth=3.0, zorder=1000) 
    plt.title('Patient ' + str(plot)) 
    plt.xlabel("Dose [Gy]", fontsize=14) 
    plt.ylabel("Volume [%]", fontsize=14) 


plt.show() 

enter image description here

+3

[fill_between()](http://matplotlib.org/examples/pylab_examples/fill_between_demo.html)私は今、このを見てみました – sascha

+0

。しかし、それはたぶん2行にしか有効ではないようですね?この場合、どのラインが最も低くなるかは事前に分かりませんが、それが最も低いポイントであれば、そのポイントで最も低いラインからシェーディングが開始されますその点で最も高い点に移動します。 –

答えて

3

曲線に沿った各点の最大値。すべての曲線が同じx値を共有する場合、これは結合されたy値の1つの軸に沿って最小値を取ることによって非常に簡単に行えます。例えば。

np.min(np.c_[y1, y2, y3, ...], axis=1) 

最大で同じです。その場合、fill_betweenは、これらの結合アレイを入力として使用できます。

完全な例:

import matplotlib.pyplot as plt 
import numpy as np; np.random.seed(4) 

# generate some data to plot 
x = np.linspace(0.8,10,201) 
f = lambda x, p1,p2,p3,p4: p1/x + np.sinc(x*p4)*p3 + p2 
Y = np.empty((len(x), 9)) 
P1 = 1.5+ (np.random.normal(size=9)-0.5)*0.2 
P2 = np.linspace(0.9,1.1, 9) 
P3 = 1+ (np.random.normal(size=9)-0.5)*0.2 
P4 = np.linspace(0.9,1.1, 9)+ (np.random.normal(size=9)-0.5) 
for i in range(9): 
    Y[:,i] = f(x,P1[i], P2[i], P3[i], P4[i]) 

# plot  
fig, ax = plt.subplots() 

style= [":"]*4 + ["-"] + ["--"]*4 
colors = ["crimson"]*4 + ["k"] + ["#9a0bad"]*4 
lw = np.ones(9); lw[4] = 2 
for i in range(9): 
    ax.plot(x,Y[:,i], linestyle=style[i], label="curve "+str(i), lw=lw[i], color=colors[i]) 

Y1min = np.min(Y[:,:4], axis=1) 
Y1max = np.max(Y[:,:4], axis=1) 
Y2min = np.min(Y[:,5:], axis=1) 
Y2max = np.max(Y[:,5:], axis=1) 

ax.fill_between(x, Y1max, Y1min, color="crimson", alpha=0.4) 
ax.fill_between(x, Y2max, Y2min, color="#9a0bad", alpha=0.4) 

plt.show() 

enter image description here

関連する問題