2011-06-05 304 views
36

我有一個關於使用area函數的問題;或許另一個功能是爲了... 我從一個大的文本文件中創建了這個情節:MATLAB,填充兩組數據之間的區域,一個圖中的行

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

綠色和藍色代表了兩個不同的文件。我想要做的是分別填寫紅線和每次運行之間的區域。我可以創建一個具有類似想法的區域圖,但是當我將它們繪製在同一個圖上時,它們不會正確重疊。基本上,4個地塊將在一個數字上。

我希望這是有道理的。

回答

4

你想看看補丁()函數,忙裏偷閒與水平行的起點和終點:

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向量以僅包含您需要的點。

+0

謝謝你,我會考慮這個補丁的功能吧! – Josh 2011-06-07 17:58:14

+0

patch()是fill()的低級版本,所以無論這個還是gnovice的答案都應該做你想做的。 – Alex 2011-06-07 22:51:02

11

您可以使用函數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' property中的手柄順序。例如,該代碼反轉堆疊順序,躲在綠色的多邊形藍色多邊形背後:

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); 
+0

這看起來也很有希望。我沒有想到嘗試像這樣的方法。我會嘗試更新你。 – Josh 2011-06-07 18:00:40

48

大廈關閉@ gnovice的回答,您可以實際上只在兩條曲線之間的區域創建陰影充滿陰謀。只需使用fillfliplr一起使用。

例子:

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數組,並與原來的串聯,你要出去,落,回,然後達到一個完全關閉這兩個陣列,多邊多邊形。

+0

關於fliplr的更多提示:如果你的向量是nx1,但你需要將它們繪製爲1xn(無論出於何種原因),請採用素數_inside_。即'yb = [y1',fliplr(y2')]'。不是'yb = [y1',fliplr(y2)']'。 – webelo 2015-12-12 20:56:38

+0

我們可以讓陰影區域填充「+」或其他不同的標記嗎? – ftxx 2017-02-25 13:50:14

+0

@ftxx當然,如果你想用矩陣填充兩條曲線之間的區域,然後用一個「+」作爲點標記來繪製它。 – Doresoom 2017-03-12 19:23:33

12

就我個人而言,我覺得它既優雅又方便包裝填充功能。 要在兩個同樣大小的行向量Y1和共享支持X(和顏色C)Y2之間填充:

fill_between_lines = @(X,Y1,Y2,C) fill([X fliplr(X)], [Y1 fliplr(Y2)], C); 
相關問題