2013-03-06 32 views
1

如何繪製一條線條,其厚度在Matlab中的每個點處變化?我需要繪製一條平均線,然後將標準差繪製爲它下方的陰影。有任何想法嗎?在Matlab中可變寬度的線條

感謝,

+0

這是一個編程/軟件開發的問題,涉及到MATLAB,由科學家和工程師,不一定程序員使用的語言。謝謝 – 2013-03-07 17:14:56

+1

我不明白爲什麼這個問題會關閉。它與編程有關(用Matlab),它是一個有效且有用的問題。我剛從谷歌來到這裏尋找解決這個問題的方法,我認爲這個解決方案證明了它的實用性。 – robince 2015-04-02 11:54:35

回答

2

這是我剛纔寫的東西 - 有點長,但你可以複製整個東西。它處理可變大小的輸入併產生一個美妙的陰影 - 以std和min/max。信號應該是2D的。如果您需要繪製兩個信號的一個版本 - 只問:)

function H = plotp(varargin) 

switch nargin 
    case{1} 
     signal = varargin{1}; 
     time = 1:size(signal,2); 
     prop = 'r-'; 
     new_figure = true; 
    case{2} 
     time = varargin{1}; 
     signal = varargin{2}; 
     prop = 'r-'; 
     new_figure = true; 
    case{3} 
     time = varargin{1}; 
     signal = varargin{2}; 
     prop = varargin{3}; 
     new_figure = true; 
    case{4} 
     time = varargin{1}; 
     signal = varargin{2}; 
     prop = varargin{3}; 
     new_figure = varargin{4}; 
end 

if ischar(new_figure) 
    temp7 = regexpi(new_figure,'true'); 
    if isempty(temp7) 
     new_figure = false; 
     H = get(0,'CurrentFigure'); 
    else 
     new_figure = true; 
    end 
elseif isnumeric(new_figure) 
    H = new_figure; 
    new_figure = false; 
end 

% prepare vectors for plotting 
time2 = [time fliplr(time)]; 

sigm = nanmean(signal); 
sigs = nanstd(signal); 
sigms = [sigm-sigs fliplr(sigm+sigs)]; 

sigmin = nanmin(signal); 
sigmax = nanmax(signal); 
sigmm = [sigmin fliplr(sigmax)]; 

% check color 
if strcmpi(prop(1),'r') 
    c1 = [1 0 0]; 
elseif strcmpi(prop(1),'g') 
    c1 = [0 1 0]; 
elseif strcmpi(prop(1),'b') 
    c1 = [0 0 1]; 
else 
    c1 = [1 1 1]; 
end 

color1 = c1 + .7*(1-c1); 
color2 = c1 + .8*(1-c1); 

% 
if length(prop) == 1 
    prop(2) = '-'; 
end 
if new_figure 
    H = figure; 
else 
    figure(H); 
end 

whole_screen = get(0,'ScreenSize'); 
% max figure size - add 
fig_size = whole_screen + [-4 -4+2*32 +4+4 4+4-2*32]; 
set(H,'OuterPosition',fig_size); 

plot(time,sigm,prop,'LineWidth',1.5) 
hold all 
fill(time2(~isnan(sigms)), sigms(~isnan(sigms)),color1,'EdgeColor',color1,'FaceAlpha', 0.4); 
fill(time2(~isnan(sigmm)), sigmm(~isnan(sigmm)),color2,'EdgeColor',color2,'FaceAlpha', 0.3); 
legend([{'Mean'} {'\pm Stddev'} {'Min/Max'} ],'Location','Best') 
+0

哇,非常感謝! – 2013-03-07 00:31:59

+0

很高興幫助。從來沒有想過我會把它從抽屜裏拿出來:) – 2013-03-07 00:33:47

+0

我想這是一個常見而重要的問題。我不知道爲什麼sbdy將問題標記爲-1 .... – 2013-03-07 00:49:01

0

,你可以畫出三條線,一個作爲平均值,另兩個爲+和 - 個標準差。

如果你感覺特別受虐狂,你可以計算你的線的置信區間並繪製它。

+0

我知道,但我想要std或CI作爲填充區域或粗線。任何想法如何做到這一點?避免使用Matlab中的「填充」,這是很麻煩的... – 2013-03-06 23:53:29

+0

發現這個從MrMartin代碼很好:>> plot_variance = @(x,lower,upper,color)set(fill([x,x(end: - 1:1)],[上,下(端:-1:1)],顏色), 'EdgeColor',顏色); – 2013-03-07 00:47:57