2013-03-06 31 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