2016-05-12 13 views
7

ho una trama del seguente tipo:Come fare colorbar riferimento ai marcatori in 3D-plot e non la superficie in Matlab

enter image description here

ho creato la superficie nero-bianco con il surf - funzione e i marker che ho tracciato usando la funzione plot3. Per ciascun marker ho definito una mappa colori tra Rosso-Giallo-Verde a seconda del valore del marcatore. Come puoi vedere dalla trama il colorbar si riferisce al momento alla superficie, ma mi piacerebbe che si riferisse ai marcatori. Come posso fare questo?

Grazie!

Qui è MWE fondamentalmente mostrando quello che faccio ora:

% 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

È una buona pratica includere un [mcve] in stackoverlfow. –

+0

Roger, arrivando :) – jjepsuomi

+0

Puoi assegnare marcatori alla mappa colori degli assi (qui in scala di grigi)? Se è così, puoi usare la texture sulla superficie per assomigliare a una mappa di colori ... – Crowley

risposta

3

Se non si basano su plot3 funzione è possibile utilizzare scatter3 invece.

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

Grazie tu @Crowley :) Qual è lo scopo della variabile'c'? Non riesco a vederlo usato ovunque dopo la sua definizione. – jjepsuomi

+0

Got it =) Darò al codice una prova con i miei dati :) Grazie mille! =) – jjepsuomi

+0

Mi dispiace, i colori dei punti erano legati all'altezza non al valore casuale. Ho modificato il codice in modo che corrisponda alla casualità del colore e utilizzi la variabile 'c'. – Crowley

Problemi correlati