MATLAB:如何通过增加和减少颜色的阴影来着色绘图区域

时间:2016-02-10 08:33:09

标签: matlab plot area

我想用一种颜色(黑色)绘制图形区域(x = 1:24y = -1:1),然后我希望在时间方面减少/增加阴影。所以,我有一个阴暗的情节'在晚上的背景和'光'白天x为小时,y为数据值的白天。我的日出将在6.8,我的日落将在22。然后,我会将散点图与数据重叠在上面。

我曾尝试弄乱patcharea,但没有运气。以下是我从互联网上的其他地方获得的一些代码,但我不确定如何继续:

% Define x, f(x), and M(x)
x = linspace(6.8, 22)';
f = sin(x)+cos(x);
M = x.^2;

% Define the vertices: the points at (x, f(x)) and (x, 0)
N = length(x);
verts = [x(:), f(:), x(:) zeros(N,1)];

% Define the faces to connect each adjacent f(x) and the corresponding points at y = 0.
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')

所以我希望最终结果与下面附带的图像类似(注意模糊阴影 - 我希望渐变更强),但x = 1:24y = -1:1

shaded plot

1 个答案:

答案 0 :(得分:0)

由于你忽略了我在你的问题中包含你的MATLAB代码结果的请求,我不得不查看我的水晶球,以确定你的“乱七八糟”导致以下错误信息:

  

使用补丁

时出错      

设置Patch的'Vertices'属性时:

     

值必须是数字类型的1x2或1x3向量

     

X中的错误(第13行)

     

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

这可以通过在第8行中垂直连接顶点而不是水平来解决:

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

这产生以下图:

resulting plot

这当然不是你想要的。

实际解决方案

您可以从5个矩形构建背景:

x = [0;
     6;    % 'First daylight'
     6.8;  % Full brightness
     22;   % Beginning of 'sunset'
     22.8; % Complete darkness
     24];

vertices = [repmat(x,2,1), [ones(size(x)); -1.*ones(size(x))]];
faces = [1:5; 2:6; 8:12; 7:11].';
color = repmat([0 0 0; % 'Night' color
                0 0 0;
                1 1 1; % 'Day' color
                1 1 1;
                0 0 0;
                0 0 0],2,1);

patch('Faces',faces, ...
      'Vertices',vertices, ...
      'FaceVertexCData',color, ...
      'FaceColor','interp', ...
      'EdgeColor','red');
xlim([0 24]);

bg rects

通过为FaceVertexCData属性指定适当的RGB值,可以使'night'矩形的顶点变黑,并将'day'矩形的顶点变为白色。

然后通过将FaceColor属性设置为'interp',在“黑色和白色”之间插入“日出”/“日落”矩形的颜色。

EdgeColor仅设置为'red',以说明背景的构建方式。将属性设置为'interp'以使线条消失。