Как получить вертикальный градиент заливки на графике Matlab

У меня есть функция 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')

Этот код показывает мне область, связанную с кривой к оси X, как

Но я хочу заполнить БЕЛУЮ область. Поэтому я модифицирую код следующим образом

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. цветовая карта не была определена как черная к красной (я могу изменить это вручную, хотя)

2 ответа

Вертикальный сдвиг произошел из-за линии

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

Вот вывод:пример затенения

Еще одна проблема - вы определяете цвет М как f.^2 - не слишком ли много в одном раунде возведения в квадрат? Я думаю, что вы имели в виду, что это х.^2 (или просто F)?

Существует, возможно, гораздо более простой способ добиться почти того же самого... нарисуйте картину следующим образом:

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 быть белым...

Другие вопросы по тегам