2016-05-12 21 views
7

Mam wykres typu:Jak colorbar dotyczą markerów w 3D działki, a nie powierzchni w Matlab

enter image description here

Stworzyłem czarny-biały powierzchnię używając surf - funkcja i znaczniki, które wykreśliłem przy użyciu funkcji plot3. Dla każdego markera zdefiniowałem colormap pomiędzy czerwono-żółtozielonym, w zależności od wartości markera. Jak widać z wykresu, colorbar odnosi się w tej chwili do powierzchni, ale chciałbym, aby odnosiło się do znaczników. Jak mogę to zrobić?

Dziękujemy!

Oto MWE zasadzie pokazując to, co robię teraz:

% Plot the surface with a colormap 
Z = peaks; 
Z = peaks./max(Z(:)); 
Z = (Z+1)*3/2; 
surf(Z) 
colormap(flipud(gray)) 
shading interp 
hold on 

% Create the 4-dimensional marker data 
x = (50-10).*rand(50,1) + 10; 
y = (50-10).*rand(50,1) + 10; 
z = (3-1).*rand(50,1) + 1; 
q = 5.*rand(50,1); % This dimension is used to select the color 

% Create the color map for the markers 
c1=[0 1 0]; %G 
c2=[1 1 0]; %Y 
c3=[1 0 0]; %R 
n1 = 20; 
n2 = 20; 
cmap=[linspace(c1(1),c2(1),n1);linspace(c1(2),c2(2),n1);linspace(c1(3),c2(3),n1)]; 
cmap(:,end+1:end+n2)=[linspace(c2(1),c3(1),n2);linspace(c2(2),c3(2),n2);linspace(c2(3),c3(3),n2)]; 
cmap = cmap'; 

% Select the colors for the markers 
marker_colors = zeros(size(50, 1), 3); 
q_interval = max(q)-min(q); 
q_int = q_interval/(n1+n2); 
q_vals = zeros(n1+n2,1); 
q_vals(1) = min(q); 
for i = 2:size(q_vals,1) 
    q_vals(i) = min(q) + (i-1)*q_int; 
end 
for i = 1:50 
    d = abs(q_vals - q(i)); 
    ind = find(d == min(d)); 
    marker_colors(i,:) = cmap(ind,:); 
    % Plot the marker 
    plot3(x(i), y(i), z(i), 'o', 'color', [0 0 0], 'MarkerFaceColor', marker_colors(i,:)) 
end 

% Lastly I plot the colorbar, which refers to the surface... :/ 
colorbar 
+1

Dobrą praktyką jest dołączenie [mcve] do stackoverlfow. –

+0

Zgadzam się, nadchodzi :) – jjepsuomi

+0

Czy można przypisać znaczniki do mapy kolorów osi (tutaj skala szarości)? Jeśli tak, możesz użyć tekstury na powierzchni, aby wyglądać jak colormap ... – Crowley

Odpowiedz

3

Jeśli nie polegać na plot3 funkcji można użyć scatter3 zamiast.

%% Data for surface 
[X,Y]=meshgrid(-2:.1:2, -2:.1:2); 
Z=max(0,peaks(X,Y)); 
C=1-cat(3,Z,Z,Z)/max(Z(:)); 

%% data for points 
x=(rand(50,1)*4)-2; 
y=(rand(50,1)*4)-2; 
z=max(0,peaks(x,y)); 
c=0.5*rand(50,1); 

%% Colormap 
c1=[0 1 0]; %G 
c2=[1 1 0]; %Y 
c3=[1 0 0]; %R 
n1 = 20; 
n2 = 20; 
cmap=[linspace(c1(1),c2(1),n1);linspace(c1(2),c2(2),n1);linspace(c1(3),c2(3),n1)]; 
cmap(:,end+1:end+n2)=[linspace(c2(1),c3(1),n2);linspace(c2(2),c3(2),n2);linspace(c2(3),c3(3),n2)]; 
cmap = cmap'; 

%% Create surface with texture defined in C 
surf(X,Y,Z,C) 
shading interp 
hold on 

%% plot points in coordinates x,y,z with markers with 12 pt in diameter, 
%% coloured according to c values, filled and with black marker edges. 
scatter3(x,y,z,12,c,'filled','markerEdgeColor','k') 

%% set colormap (change will apply only for scatter because surf uses texxture map) 
colormap(cmap) 
colorbar 
+0

Dziękujemy ty @Crowley :) Jaki jest cel zmiennej "c"? Po jego definicji nie widzę, żeby był używany. – jjepsuomi

+0

Mam to =) Podam kod z moimi danymi :) Dziękuję bardzo! =) – jjepsuomi

+0

Przykro mi, kolory punktów były związane z wysokością, a nie z wartością losową. Zmodyfikowałem kod tak, aby odpowiadał losowości kolorów i używał zmiennej 'c'. – Crowley