Как я могу заполнить объекты заплатки, используя цветовую карту вместо сплошного цвета? - PullRequest
6 голосов
/ 05 июня 2011

Мне нужно создать сюжет, как на этом изображении:

model that i want to replicate

Я написал этот код:

close all

x = [NaN 1 3 7 9 23 8];
y = [NaN 2 6 7 8 2 1];
z = [NaN 1 4 5 5 4 1];

for n = 1:length(z)-1
    x1 = x(n);
    x2 = x(n+1);
    y1 = y(n);
    y2 = y(n+1);
    z1 = z(n);
    z2 = z(n+1);
    p = patch([x1 x2 x2 x1], [y1 y2 y2 y1], [0 0 z2 z1], [0 1 1]);
    set(p, 'LineStyle', 'none');
    plot3([x1 x2], [y1 y2], [z1 z2], 'b-', 'linewidth', 3);
    hold on
end

view(3);
light

И я получаю это:

Model generated by this code

Это нормально, но у каждого лица патча есть сплошной цвет, где я хотел бы иметь градиент цвета, основанный на значении Z, как на первом изображении, где самые низкие значения z - лазурные, а самые высокие значения z - белые градиент от низшего к высшему).

Как я могу изменить свой скрипт, чтобы получить этот эффект?

1 Ответ

5 голосов
/ 06 июня 2011

Существует несколько способов определить ваши патчи , а также несколько способов покрасить их . Вот способ создать ваши данные координат без цикла for и построить и раскрасить ваши патчи с помощью одного вызова функции patch:

x = [NaN 1 3 7 9 23 8];  %# Sample x data
y = [NaN 2 6 7 8 2 1];   %# Sample y data
z = [NaN 1 4 5 5 4 1];   %# Sample z data

N = numel(x);                        %# The number of sample data points
X = [x; x([1 1],[N 1:N-1]); x];      %# X coordinates (one patch per column)
Y = [y; y([1 1],[N 1:N-1]); y];      %# Y coordinates (one patch per column)
Z = [z; z([N 1:N-1]); zeros(2,N)];   %# Z coordinates (one patch per column)
C = round(63.*Z./max(Z(:)))+1;       %# Color map index
map = [linspace(0,1,64).' ...       %'# Color map (64 values spanning from
       ones(64,2)];                  %#   white to cyan)

figure();                               %# Open a new figure
patch(X,Y,Z,C,'FaceColor','interp',...  %# Plot the patches
      'EdgeColor','none');
colormap(map);                          %# Update color map
hold on;                                %# Add to the plot
line(X(1:2,:),Y(1:2,:),Z(1:2,:),...     %# Plot the line
     'Color','b','LineWidth',2);
view(3);                                %# Change the view

И это даст вам следующий график с пятнами, окрашенными в белый цвет при самых высоких значениях и переходящими в голубой при самых низких значениях:

enter image description here

Объяснение индексированного цветового отображения ...

Переменная map, приведенная выше, представляет собой матрицу 64 × 3 со значениями от 0 до 1. Каждая строка представляет триплет RGB , определяя таким образом уникальный цвет в диапазоне от голубого в строке 1 до белого. в строке 64. Используется в качестве карты цветов рисунка. Данные цвета лица в C представляют собой набор индексов строк в этой цветовой карте, по одному для каждого значения в Z. Самые низкие значения в Z сопоставляются с индексом 1 (голубой на цветовой карте), а самые большие значения отображаются с индексом 64 (белый на цветовой карте).

...