Matlab:两条曲线之间的补丁区域取决于曲线值

标签 matlab plot matlab-figure colormap

我正在尝试根据取决于曲线值的函数填充两条曲线之间的区域。

这是我到目前为止所做的代码

    i=50;
cc = @(xx,x,y) 1./(1+(exp(-xx)/(exp(-x)-exp(-y))));
n_vec = 2:0.1:10;
x_vec = linspace(2,10,length(n_vec));
y_vec = abs(sin(n_vec));
N=[n_vec,fliplr(n_vec)];  
X=[x_vec,fliplr(y_vec)];
figure(1)
subplot(2,1,1)
hold on
plot(n_vec,x_vec,n_vec,y_vec)
hp = patch(N,X,'b')
plot([n_vec(i) n_vec(i)],[x_vec(i),y_vec(i)],'linewidth',5)
xlabel('n'); ylabel('x')
subplot(2,1,2)

xx = linspace(y_vec(i),x_vec(i),100);
plot(xx,cc(xx,y_vec(i),x_vec(i)))
xlabel('x'); ylabel('c(x)')

这段代码产生了下图

enter image description here

我添加的颜色代码表示两条曲线之间区域的每条线(沿 y 轴在 x 轴上的一个点)应该是的颜色编码。

总的来说,整个区域应该用渐变颜色填充,这取决于曲线的值。

我已经协助解决了以下问题,但无法解决问题

MATLAB fill area between lines

Patch circle by a color gradient

Filling between two curves, according to a colormap given by a function MATLAB

注意:曲线的函数形式并不重要,我更喜欢一个答案,它指的是构成曲线的两个通用数组。

最佳答案

冲浪图法

  1. 与散点图方法相同,即生成点网格。
y = [x_vec(:); y_vec(:)];
resolution = [500,500];
px = linspace(min(n_vec), max(n_vec), resolution(1));
py = linspace(min(y), max(y), resolution(2));
[px, py] = meshgrid(px, py);
  1. 生成一个逻辑数组,指示点是否在多边形内,但不需要提取点:
in = inpolygon(px, py, N, X);
  1. 生成 Z。Z 的值指示用于曲面图的颜色。因此,它是使用您的函数 cc 生成的。
pz = 1./(1+(exp(-py_)/(exp(-y_vec(i))-exp(-x_vec(i)))));
pz = repmat(pz',1,resolution(2));
  1. 将感兴趣区域外的点的 Z 值设置为 NaN,这样 MATLAB 就不会绘制它们。
pz(~in) = nan;
  1. 生成有界颜色图(如果您想使用全色范围,请删除)
% generate colormap
c = jet(100);
[s,l] = bounds(pz,'all');
s = round(s*100);
l = round(l*100);
if s ~= 0
    c(1:s,:) = [];
end
if l ~= 100
    c(l:100,:) = [];
end
  1. 最后,情节。
figure;
colormap(jet)
surf(px,py,pz,'edgecolor','none');
view(2) % x-y view

enter image description here

随意转动图像,看看它在 Z 方向上的样子 - 漂亮 :)

enter image description here


要测试的完整代码:

i=50;
cc = @(xx,x,y) 1./(1+(exp(-xx)/(exp(-x)-exp(-y))));
n_vec = 2:0.1:10;
x_vec = linspace(2,10,length(n_vec));
y_vec = abs(sin(n_vec));

% generate grid
y = [x_vec(:); y_vec(:)];
resolution = [500,500];
px_ = linspace(min(n_vec), max(n_vec), resolution(1));
py_ = linspace(min(y), max(y), resolution(2));
[px, py] = meshgrid(px_, py_);

% extract points
in = inpolygon(px, py, N, X);

% generate z
pz = 1./(1+(exp(-py_)/(exp(-y_vec(i))-exp(-x_vec(i)))));
pz = repmat(pz',1,resolution(2));
pz(~in) = nan;

% generate colormap
c = jet(100);
[s,l] = bounds(pz,'all');
s = round(s*100);
l = round(l*100);
if s ~= 0
    c(1:s,:) = [];
end
if l ~= 100
    c(l:100,:) = [];
end

% plot
figure;
colormap(c)
surf(px,py,pz,'edgecolor','none');
view(2)

关于Matlab:两条曲线之间的补丁区域取决于曲线值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57782991/

相关文章:

matlab - 尽管在 if 语句中定义了变量,但变量未定义

matlab - 绘制隐藏变量/参数

r - 绘制两个时间序列 : axis issue

python - 从Python中的曲面图中删除阴影

java - Matlab Compiler SDK plot waitforFigures函数多线程

matlab - 多步预测神经网络

matlab - Matlab中的filter和conv有什么区别?

.net - 在 .net 中绘制科学数据

Matlab 代码不会绘制函数的一部分

matlab - 在事件轮廓法中绘制能量