Matlab Ploting с различным цветом для iso-поверхности - PullRequest
1 голос
/ 10 октября 2011

Я пытался использовать код, показанный ниже, чтобы построить таким образом, что каждая изоповерхность будет отличаться по цвету, и справа будет цветная полоса.Я сделал ss(k) цветовую матрицу для разных цветов.Количество изоповерхностей - 10, но у меня всего 8 цветов.Вот почему я написал ss(9)='r' и ss(10)='r'.

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

ss=['y','m','c','r','g','b','w','k','r','r']
k=1;
for i=.1:.1:1
 p=patch(isosurface(x,y,z,v,i));
 isonormals(x,y,z,v,p)
 hold on;

 set(p,'FaceColor',ss(k),'EdgeColor','none');
 daspect([1,1,1])
 view(3); axis tight
 camlight 
 lighting gouraud
 k=k+1;
end

enter image description here

Ответы [ 3 ]

3 голосов
/ 15 октября 2011

Другая возможность - нарисовать патчи с помощью прямого цветового сопоставления (установив свойство 'CDataMapping'='direct'), при этом присваивая 'CData' каждого патча индексу цветовая карта на ваш выбор. На самом деле это рекомендуется для максимальной производительности графики.

Рассмотрим следующий пример:

%# volumetric data, and iso-levels we want to visualize
[x,y,z,v] = flow(25);
isovalues = linspace(-2.5,1.5,6);
num = numel(isovalues);

%# plot isosurfaces at each level, using direct color mapping
figure('Renderer','opengl')
p = zeros(num,1);
for i=1:num
    p(i) = patch( isosurface(x,y,z,v,isovalues(i)) );
    isonormals(x,y,z,v,p(i))
    set(p(i), 'CData',i);
end
set(p, 'CDataMapping','direct', 'FaceColor','flat', 'EdgeColor','none')

%# define the colormap
clr = hsv(num);
colormap(clr)

%# legend of the isolevels
%#legend(p, num2str(isovalues(:)), ...
%#  'Location','North', 'Orientation','horizontal')

%# fix the colorbar to show iso-levels and their corresponding color
caxis([0 num])
colorbar('YTick',(1:num)-0.5, 'YTickLabel',num2str(isovalues(:)))

%# tweak the plot and view
box on; grid on; axis tight; daspect([1 1 1])
view(3); camproj perspective
camlight; lighting gouraud; alpha(0.75);
rotate3d on

screenshot

Я также включил (прокомментировал) код для отображения легенды, но я обнаружил, что он избыточен, а цветовая полоса выглядит лучше.

1 голос
/ 10 октября 2011

Matlab обычно наносит различные изо-поверхности на разные цвета автоматически, поэтому вам не нужно об этом заботиться. Какой бар вам нужен? Цветная панель или легенда? В любом случае, это просто использовать цветовую панель или функцию легенды.

%Create some nice data
[x y z] = meshgrid(1:5,1:5,1:5); 
v = ones(5,5,5);
for i=1:5
   v(:,:,i)=i;
end
v(1:5,3:5,2)=1
v(1:5,4:5,3)=2

%Plot data
for i=1:5
isosurface(x,y,z,v,i)
end

%Add legend and/or colorbar
legend('one','Two','Three','Four')
colorbar

image

0 голосов
/ 10 октября 2011

Поскольку цветовая полоса кодирует значение-> цвет, невозможно выполнить то, что вы просите, , если только не будет пересечения значений z между всеми парами поверхностей. Таким образом, решение ниже предполагает, что это так. Если это не так, вы все равно можете достичь этого, добавив постоянное значение к каждой поверхности, чтобы разделить поверхности вдоль оси z и устранить любое пересечение.

Решение основано на построении матрицы цветовых карт кусочно-постоянных значений, распределенных аналогично значениям z ваших поверхностей. Так, например, если у вас есть 3 поверхности, первая из которых имеет значения z от 1 до 10, вторая от 11 до 30 и третья от 31 до 60, вы должны сделать что-то вроде этого (для простоты я строю 2D)

r = [1 0 0];
g = [0 1 0];
b = [0 0 1];
cmap = [r(ones(10,1),:); g(ones(20,1),:); b(ones(30,1),:)];

z1 = 1:10;
z2 = 11:30;
z3 = 31:60;

figure; hold on
plot(z1,'color',r)
plot(z2,'color',g)
plot(z3,'color',b)
colorbar
colormap(cmap)

custom colorbar

Более сложные цветовые карты (т. Е. Больше цветов) могут быть созданы с использованием различных смесей красного, зеленого и синего (http://www.mathworks.com/help/techdoc/ref/colorspec.html)

).
...