2012-07-01 3 views
5

У меня есть карта местности, которую я хотел бы представить некоторые данные Смотрите ниже:.Matlab прибой с различными цветовыми схемами

enter image description here

область на правом кружке белым является отдельным прибоем функции до остальной части графика. То, что я хотел бы сделать, это изменить цветовую схему. Внешний вид должен быть серого цвета, а внутри должен быть один цвет, основанный на значении, которое я разделяю с графиком. В настоящее время я попробовал функцию colormap (серый), затем изменил, но это изменило весь график.

Я открыт для предложений о различных стилях построения шрифтов, т.е. plot3 вместо серфинга. Таким образом, данные, которые я должен сделать для этих двух серфиков, - это два списка точек x, y, z.

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

Кто-нибудь знает, как это сделать?

Спасибо.

EDIT:

Что я хотел бы сделать это:

enter image description here

Изображение не должно быть темно-синего цвета в верхней части насыпи. Изображение будет постоянно обновляться с большим количеством «синих» пятен, цвет должен меняться в зависимости от внешнего значения, и в идеале он будет смешивать цвета с предыдущими пятнами, если они перекрываются.

ответ

2

Вы видели это из технической поддержки MATLAB?

http://www.mathworks.com/support/solutions/en/data/1-GNRWEH/index.html

Вы можете редактировать colorbar свойства.

g = colorbar; 
get(g) 

Например,

% Define a colormap that uses the cool colormap and 
% the gray colormap and assign it as the Figure's colormap. 
colormap([cool(64);gray(64)]) 


% Generate some surface data. 
[X,Y,Z] = peaks(30); 


% Produce the two surface plots. 
h(1) = surf(X,Y,Z); 
hold on 
h(2) = pcolor(X,Y,Z); 
hold off 


% Move the pcolor to Z = -10. 
% The 0*Z is in the statement below to insure that the size 
% of the ZData does not change. 
set(h(2),'ZData',-10 + 0*Z) 
set(h(2),'FaceColor','interp','EdgeColor','interp') 
view(3) 


% Scale the CData (Color Data) of each plot so that the 
% plots have contiguous, nonoverlapping values. The range 
% of each CData should be equal. Here the CDatas are mapped 
% to integer values so that they are easier to manage; 
% however, this is not necessary. 


% Initially, both CDatas are equal to Z. 
m = 64; % 64-elements is each colormap 


cmin = min(Z(:)); 
cmax = max(Z(:)); 
% CData for surface 
C1 = min(m,round((m-1)*(Z-cmin)/(cmax-cmin))+1); 
% CData for pcolor 
C2 = 64+C1; 


% Update the CDatas for each object. 
set(h(1),'CData',C1); 
set(h(2),'CData',C2); 


% Change the CLim property of axes so that it spans the 
% CDatas of both objects. 
caxis([min(C1(:)) max(C2(:))]) 

% I added these two lines 
g = colorbar 
set(g,'YLim',[1 60]) 

Последние две строки мои. Остальная часть находится в разделе технической поддержки MATLAB. И он даст вам цветную панель с одним цветом. Если вам нужна серая половина цветовой карты, вы бы сделали set(g,'YLim',[64 128]).

enter image description here

+0

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

7

Поскольку вы хотите установить кружком область только один цвет, вы можете установить это свойство FaceColor. Например:

%# make some test data 
[xx,yy]=ndgrid(-5:0.1:5,-5:0.1:5); 
zz = exp(-xx.^2/2+-yy.^2/2); 
zz1 = zz; 
zz1(zz1>0.5)=NaN; 
zz2 = zz; 
zz2(zz2<0.5)=NaN; 

%# plot first surface, set colormap 
surf(zz1) 
colormap('gray') 

%# stretch colormap to [0 0.5] 
caxis([0 0.5]) 

%# plot the second surface in red 
hold on 
surf(zz2,'faceColor','r') 

enter image description here

EDIT

Если вы хотите иметь различные цветовые карты для части ваших поверхностей, необходимо установить 'CData' свойства поверхностей индексов в палитру ,Чтобы отображать только одну цветочную карту в цветовой панели, вы можете использовать тот факт, что цветная панель - это просто еще один сюжет, что означает, что вы можете отображать только ее часть и изменять метки.

%# make some more test data 
[xx,yy]=ndgrid(-5:0.1:5,-5:0.1:5); 
zz = exp(-xx.^2/2+-yy.^2/2); 
zz1 = zz(1:50,:); 
zz2 = zz(52:end,:); 
xx1 = xx(1:50,:);xx2=xx(52:end,:); 
yy1 = yy(1:50,:);yy2=yy(52:end,:); 

%# create multi-colormap, set it to figure 
figure 
cmap = [gray(128);copper(128)]; 
colormap(cmap) 

%# plot surfaces, setting the cdata property to indices 1-128 and 129-256, 
%# respectively, in order to access the different halves of the colormap 
surf(xx1,yy1,zz1,'cdata',round(127*(zz1-min(zz1(:))/(max(zz1(:))-min(zz1(:)))))+1,'cdatamapping','direct') 
hold on 
surf(xx2,yy2,zz2,'cdata',round(127*(zz2-min(zz2(:))/(max(zz2(:))-min(zz2(:)))))+129,'cdatamapping','direct') 

%# find the handle to the colorbar 
%# alteratively: cbarH = findall(gcf,'tag','Colorbar') 
cbarH = colorbar; 

%# set limits and ticks/labels 
ylim(cbarH,[129 255]) 
set(cbarH,'ytick',[129 192 255],'yticklabel',[0 0.5 1]) 

enter image description here

+0

@Ben: Кажется, я, возможно, неправильно понял ваш вопрос - вам, кажется, нужны разные цветовые карты для разных частей поверхности. Я добавил пример того, как это сделать. – Jonas

+0

Спасибо за это. Проблема, которую я пытаюсь решить, снова стала немного сложнее. Я хотел бы иметь цветовую схему (т. Е. Оттенки серого) для большей части карты, но средняя часть должна быть одного цвета, и я планирую добавлять эти серфики с разными сплошными цветами. Какие-нибудь идеи об этом? (Цвета представляют собой другой набор данных, я пытаюсь сопоставить эти данные на трехмерной поверхности, представляя его с рядом цветов, эти данные будут варьироваться от 0 до 3 и несколько непрерывны). –

+0

@Ben: Я не уверен, что я следую. Что значит «средняя часть»? Это другая часть поверхности? Вы хотите, чтобы группа обходилась на фиксированной высоте? Что вы имеете в виду с одним цветом? Просто красный или зеленый, или цветной, черный -> зеленый, а не черный - белый? Было бы полезно, если бы вы могли сделать фотошоп. – Jonas

Смежные вопросы