0

我有一个要绘制的函数 y=x^2 ,我想用沿 y 方向从黑色到红色的渐变色填充这条曲线所界定的区域。我在网上找到了颜色

x = linspace(-3, 3, 20)';
f = x.^2;
M = f.^2;

N = length(x);
verts = [x(:), f(:)-max(f); x(:) zeros(N,1)];

q = (1:N-1)';
faces = [q, q+1, q+N+1, q+N];
p = patch('Faces', faces, 'Vertices', verts, 'FaceVertexCData', [M(:); M(:)], 'FaceColor', 'interp', 'EdgeColor', 'none')

这段代码向我展示了与曲线绑定到 xaxis 的区域,例如

在此处输入图像描述

但我要填充的是白色区域。所以我修改代码如下

x = linspace(-3, 3, 20)';
f = x.^2;
M = f.^2;

N = length(x);
verts = [x(:), f(:)-max(f); x(:) zeros(N,1)];

q = (1:N-1)';
faces = [q, q+1, q+N+1, q+N];
p = patch('Faces', faces, 'Vertices', verts, 'FaceVertexCData', [M(:); M(:)], 'FaceColor', 'interp', 'EdgeColor', 'none')

这给了我类似以下的东西 在此处输入图像描述

它填补了正确的区域,但有两个问题:

  1. 整个图像向负 y 轴移动 9 个单位
  2. 渐变颜色从左到右填充,但我希望它从下到上(垂直)填充
  3. 颜色图未定义为黑色到红色(我可以手动更改)
4

2 回答 2

1

垂直移动是因为这条线而发生的

verts = [x(:), f(:)-max(f); x(:) zeros(N,1)];

哪里f(:) - max(f)总是 <=0 。我认为你只需要使用f(:)来解决这个问题。

至于阴影的方向,由于您将补丁定义为垂直条,它们将被着色为垂直条。如果你想要水平着色,你需要定义水平面片。你能弄清楚吗,或者你需要帮助吗?

编辑-此代码可以满足您的要求:

figure;
x=linspace(-3, 3, 200);
f = x.^2;
plot(x, f, 'r'); hold on % you could leave this line out... then there is no curve
N = numel(x);
for ii = ceil(N/2):N-1
    ix = [ii ii+1 N-ii N-ii+1];
    disp(ix)
    patch(x(ix), f(ix), f(ii)*256/max(f(:)),'edgecolor', 'none');
end

这是输出: 着色示例

还有一个问题 - 您将颜色 M 定义为 f.^2 - 这不是一轮平方太多吗?我认为您的意思是 x.^2 (或只是 F)?

于 2013-02-18T03:54:23.093 回答
0

有一种可能更简单的方法来实现几乎相同的事情......如下绘制图片:

cplot = repmat(1:256, [256 1])';    % create a 256 square horizontal gradient
xv = linspace(-3, 3, 256);          % range of x values
yv = linspace(0, 9, 256);           % range of y values
cplot(repmat(xv.^2, [256 1])>repmat(yv', [1 256]))=255; % set area below the curve to white
figure
imagesc(xv, yv, cplot);

现在您所要做的就是修复色标...您希望颜色255为白色...

于 2013-02-18T04:05:11.930 回答