2012-07-01 15 views
5

Mam mapę terenu, które chciałbym reprezentują pewne dane Patrz zdjęcie poniżej.Matlab surfowania z różnych schematów kolorów

enter image description here

Obszar po prawej otoczone białe jest oddzielny surfowania funkcja do pozostałej części działki. To, co chciałbym móc zrobić, to zmienić schemat kolorów. Zewnętrzna powinna być w skali szarości, a wewnętrzna powinna być jednokolorowa w oparciu o wartość, którą oddzielam od wykresu. Obecnie próbowałem funkcji Colormap (szary), a następnie zmieniałem, ale to zmienia cały wykres.

Jestem otwarty na sugestie dotyczące różnych stylów kreślenia, tj. plot3 zamiast surfować. Więc dane, które muszę wykonać, to dwie listy punktów x, y, z.

Jeśli to możliwe, chciałbym również wyświetlić pasek kolorów, który reprezentuje kolor okręgu (który zostanie ustawiony przeze mnie na podstawie wartości zewnętrznej).

Czy ktoś wie o dobrym sposobie na zrobienie tego?

Dzięki.

EDIT:

Co chciałbym zrobić to w ten sposób:

enter image description here

obraz nie powinien mieć ciemnoniebieskim na szczycie kopca. Obraz będzie stale aktualizowany o więcej "niebieskich" plam, kolor powinien się zmieniać w oparciu o wartość zewnętrzną, a najlepiej będzie scalać kolory z poprzednimi miejscami, jeśli się nakładają.

Odpowiedz

2

Widziałeś to od MATLAB Tech Support?

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

można edytować właściwości colorbar.

g = colorbar; 
get(g) 

Na przykład

% 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]) 

Ostatnie dwa wiersze są moje. Reszta pochodzi z łącza wsparcia technicznego MATLAB. I dostaniesz pasek kolorów z jedną mapą kolorów. Jeśli chciałbyś mieć szarą połowę mapy kolorów, zrobiłbyś set(g,'YLim',[64 128]).

enter image description here

+0

Hey można myśleć o sposób, aby wyświetlić pasek koloru dla tylko jednej części wyświetlacza? –

7

Ponieważ chcesz ustawić obszar kółkiem tylko na jeden kolor, można ustawić to FaceColor nieruchomość. Na przykład:

%# 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

Jeśli chcesz mieć różne colormaps dla części swoich powierzchniach, należy ustawić właściwość powierzchni 'CData' z indeksami do colormap .Aby wyświetlić tylko jedną mapę kolorów na pasku kolorów, można skorzystać z faktu, że pasek kolorów to po prostu kolejna fabuła, co oznacza, że ​​można wyświetlić tylko jej część i zmienić etykiety.

%# 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: Wygląda na to, że źle zrozumiałem twoje pytanie - wydajesz się, że chcesz mieć różne mapy kolorów dla różnych części powierzchni. Dodałem przykład, jak to zrobić. – Jonas

+0

Dzięki za to, problem, który próbuję rozwiązać, stał się znowu bardziej skomplikowany. Chciałbym mieć schemat kolorów (np. Skalę szarości) dla większości map, ale środkowa sekcja powinna być jednokolorowa i planuję dodawać te surfowania z różnymi jednolitymi kolorami. Jakieś pomysły na robienie tego? (Kolory reprezentują inny zestaw danych, próbuję odwzorować te dane na powierzchnię 3d, przedstawiając ją w zakresie kolorów, dane te będą w zakresie od 0 do 3 i będą nieco ciągłe). –

+0

@Ben: Nie jestem pewien, czy podążam. Co masz na myśli mówiąc "sekcja środkowa"? Czy to inna część powierzchni? Czy chcesz mieć zespół chodzący po stałej wysokości? Co masz na myśli mówiąc o jednym kolorze? Po prostu czerwony, zielony lub koszar, który przechodzi w czarny -> zielony zamiast czarnego -> biały? Byłoby pomocne, gdybyś mógł zrobić zdjęcie przykładowe. – Jonas

Powiązane problemy