web-dev-qa-db-ja.com

MATLAB、2つのデータセット間の領域の塗りつぶし、1つの図の行

area関数の使用について質問があります。またはおそらく別の関数が順番に並んでいます...このプロットを大きなテキストファイルから作成しました。

http://img818.imageshack.us/img818/9519/iwantthisareafilledin.jpg

緑と青は2つの異なるファイルを表します。私がやりたいのは、それぞれ赤い線と各実行の間の領域を埋めることです。同様のアイデアでエリアプロットを作成できますが、同じ図にプロットすると、正しく重なりません。基本的に、1つの図に4つのプロットがあります。

これが理にかなっていることを願っています。

40
Josh

@gnoviceの答えを基に、2つの曲線の間の領域にのみ陰影のある塗りつぶしプロットを実際に作成できます。 fill と組み合わせて fliplr を使用するだけです。

例:

x=0:0.01:2*pi;                  %#initialize x array
y1=sin(x);                      %#create first curve
y2=sin(x)+.5;                   %#create second curve
X=[x,fliplr(x)];                %#create continuous x value array for plotting
Y=[y1,fliplr(y2)];              %#create y values for out and then back
fill(X,Y,'b');                  %#plot filled area

enter image description here

X配列を反転し、元の配列と連結することにより、完全な多多面ポリゴンで両方の配列を閉じ、外に、下に、後ろに、そして上に移動します。

53
Doresoom

個人的には、fill関数をラップするのがエレガントで便利だと感じています。 2つの等しいサイズの行ベクトル間を埋めるY1およびY2サポートを共有するX(および色C):

fill_between_lines = @(X,Y1,Y2,C) fill( [X fliplr(X)],  [Y1 fliplr(Y2)], C );
13
user609961

関数 [〜#〜] fill [〜#〜] を使用してこれを達成し、プロットのセクションの下に塗りつぶしポリゴンを作成できます。一番下のものから始めて、ラインとポリゴンを画面に積み重ねる順序でプロットします。サンプルデータの例を次に示します。

x = 1:100;             %# X range
y1 = Rand(1,100)+1.5;  %# One set of data ranging from 1.5 to 2.5
y2 = Rand(1,100)+0.5;  %# Another set of data ranging from 0.5 to 1.5
baseLine = 0.2;        %# Baseline value for filling under the curves
index = 30:70;         %# Indices of points to fill under

plot(x,y1,'b');                              %# Plot the first line
hold on;                                     %# Add to the plot
h1 = fill(x(index([1 1:end end])),...        %# Plot the first filled polygon
          [baseLine y1(index) baseLine],...
          'b','EdgeColor','none');
plot(x,y2,'g');                              %# Plot the second line
h2 = fill(x(index([1 1:end end])),...        %# Plot the second filled polygon
          [baseLine y2(index) baseLine],...
          'g','EdgeColor','none');
plot(x(index),baseLine.*ones(size(index)),'r');  %# Plot the red line

結果の図は次のとおりです。

enter image description here

また、 'Children'プロパティ Axesオブジェクト。たとえば、次のコードはスタック順序を逆にして、緑のポリゴンを青のポリゴンの後ろに隠します。

kids = get(gca,'Children');        %# Get the child object handles
set(gca,'Children',flipud(kids));  %# Set them to the reverse order

最後に、前もってポリゴンをスタックする順序を正確に知らない場合(つまり、どちらかが小さいポリゴンで、おそらく一番上にしたい場合)、 'FaceAlpha' property これにより、一方または両方のポリゴンが部分的に透明になり、その下にもう一方が表示されます。たとえば、次の例は緑のポリゴンを部分的に透明にします。

set(h2,'FaceAlpha',0.5);
11
gnovice

Patch()関数を見て、水平線の開始点と終了点をスニークしたい場合:

x = 0:.1:2*pi;
y = sin(x)+Rand(size(x))/2;

x2 = [0 x 2*pi];
y2 = [.1 y .1];
patch(x2, y2, [.8 .8 .1]);

データの一部にのみ塗りつぶし領域が必要な場合は、xおよびyベクトルを切り捨てて、必要なポイントのみを含める必要があります。

4
Alex