我正在寻找一种方法来绘制每条线的阴影区域,这是根据点的分布计算的(参见附图)。该区域应具有固定宽度(绘制线上方和下方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
答案 0 :(得分:1)
一个很好的可能性是创建具有更大线宽的相同绘图并使其透明。不幸的是,这在MATLAB中并不容易实现,但有一些解决方法。您可以使用z=0
创建surface地块,其外观与绘图完全相同。
请注意,如果x
和y
分别是大小为1 x n
和1 x m
的向量,则surface
会假定z
是矩阵大小为m x n
。因此,您需要制作x
,y
和z
矩阵。您可以通过[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;
创建:
答案 1 :(得分:0)
我在使用patch
或surface
之间犹豫不决,而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版本):
正如我上面所说,对于这个例子,最后一点重新插值是过度的(补丁实际上有更多数据点而不是曲线),但好处是它具有很高的可扩展性。如果你的初始曲线有10个 7 点,你可以使用完全相同的方法,补丁不会占用你的记忆(你的曲线可能)。
请注意,像素/数据比率的计算取决于屏幕图形的大小。如果您调整图形的大小,则不会更新计算。您必须重新执行计算部分并更新图形对象,或者最简单的方法是先将图形设置为所需的大小,然后执行计算并绘制图形对象。