绘制线条周围的阴影区域

时间:2015-01-26 13:45:51

标签: matlab plot

我正在寻找一种方法来绘制每条线的阴影区域,这是根据点的分布计算的(参见附图)。该区域应具有固定宽度(绘制线上方和下方10个像素)。事情比平常要复杂一些,因为编写代码是为了考虑一系列数据集,并且对于每个集合,我需要绘制几条曲线(数字从set更改为set)。我尝试了各种方法,包括errorbar(f(xx,:), threshold_distance_fit),没有成功。

您如何建议解决问题?

以下是我用于绘制数据集和曲线的代码:

g = figure; xlabel('Omega'); ylabel('Y_detector');
plot(Angle, Y_measured, '*'); hold on;
f = zeros(number_centers, 180);
for xx = 1:number_centers
   for deg = 1:180
       % f is the fitting function
       f(xx, deg) = double((R_fit(xx)*sind(alpha_fit(xx)+deg)/0.05)+113);
   end
   plot(1:180, f(xx,:), '.'); hold on;
 end

enter image description here

2 个答案:

答案 0 :(得分:1)

一个很好的可能性是创建具有更大线宽的相同绘图并使其透明。不幸的是,这在MATLAB中并不容易实现,但有一些解决方法。您可以使用z=0创建surface地块,其外观与绘图完全相同。

请注意,如果xy分别是大小为1 x n1 x m的向量,则surface会假定z是矩阵大小为m x n。因此,您需要制作xyz矩阵。您可以通过[x;x]轻松完成此操作(假设x是行向量)。

然后,您可以指定曲面图的线宽,颜色和不透明度(alpha值)。

E.g。

x = 0:0.01:2*pi;
y = sin(2*x);
z = zeros(size(x));

hold on;
surface([x;x],[y;y],[z;z], 'linew',20, 'edgecolor','r', 'edgealpha',0.2);
plot(x,y,'-r');
hold off;

创建:

Example image sin(2*x)

答案 1 :(得分:0)

我在使用patchsurface之间犹豫不决,而hbaderts在提出surface选项方面的速度更快,因此我将向您展示如何使用patch进行操作。

我将在我的示例中提供更多构造细节,但如果您愿意,最终可以用曲面对象替换我的补丁。

首先,我开始构建一系列与您相似的曲线:

colorCollection = get(0,'defaultAxesColorOrder') ;
nPlot = 4 ;

h.fig  = figure ;
h.ax   = axes('NextPlot','add') ;

x = linspace(0,180) ;
f = zeros( nPlot , numel(x) ) ;
for k=1:nPlot
    f(k,:) = sin(k*x/180*pi) * 180 ;
    h.plotf(k) = plot( x , f(k,:) , '.' , 'Color',colorCollection(k,:) ) ;
end

这创建并绘制4条曲线。接下来要解决的问题是“ 10像素以上和10像素”。绘制的曲线或任何贴片/曲面将不具有“像素”的概念,而仅具有数据空间中的值。所以你必须知道如何将像素转换为数据或反过来。

%// retrieve a few propery values
xlim = get(h.ax,'XLim') ;               %// axes X limits
ylim = get(h.ax,'YLim') ;               %// axes Y limits
set( [h.ax h.fig] , 'Unit','Pixels')    %// set the axes units in pixel
axpos = get( h.ax,'Position') ;         %// get the coordinates of the axes object on the figure (in pixels)
nPix.W = round(axpos(3)) ;              %// axes WIDTH  , in [pixel]
nPix.H = round(axpos(4)) ;              %// axes HEIGHT , in [pixel]

%// calculate the vertical data/pixel ratio (to know how much "y" value
%// will correspond to "10" pixels)
nPixelOverlap = 10 ;                            %// this is defined in your question
pixelRatio  = (ylim(2)-ylim(1)) ./ nPix.H ;     %// =0.0052 in my example. => 1pixel=0.0052*y
dataOverlap = nPixelOverlap .* pixelRatio ;     %// how much I have to add or remove to a curve to cover 10 pixels

一旦我有了这个神奇的系数dataOverlap,我就可以构建必须包含每条曲线的图形对象,它们的上下Y边界将是曲线的值,{{1分别加上和减去。

在你的情况下,似乎你没有大的向量(没有那么多dataOverlap值),所以下面的解决方案的一部分可能对你的问题有点过分。但是如果你不得不对大数据向量(如数千或更差,数百万个元素)做同样的事情,用这么多点创建许多补丁(甚至表面)很可能几乎冻结你的数字(非常慢的响应时间,如果不是更糟)。一个简单的方法是绘制一个缩减采样版本。由于我们已经计算了轴跨越多少像素,我们可以创建这个尺寸的图形对象(因此我们基本上每个像素有一个x个点,不再有)。

x

如果您一次性执行此示例,您应该获得非常相似的内容(颜色可能会有所不同,具体取决于您使用的Matlab版本):

multipatch

正如我上面所说,对于这个例子,最后一点重新插值是过度的(补丁实际上有更多数据点而不是曲线),但好处是它具有很高的可扩展性。如果你的初始曲线有10个 7 点,你可以使用完全相同的方法,补丁不会占用你的记忆(你的曲线可能)。


请注意,像素/数据比率的计算取决于屏幕图形的大小。如果您调整图形的大小,则不会更新计算。您必须重新执行计算部分并更新图形对象,或者最简单的方法是先将图形设置为所需的大小,然后执行计算并绘制图形对象。