2016-05-12 20 views
7

Tôi có một lô các loại sau đây:Làm thế nào để làm cho colorbar tham khảo mốc trong không gian 3D-cốt truyện và không phải là bề mặt trong Matlab

enter image description here

Tôi đã tạo ra bề mặt màu đen-trắng bằng cách sử dụng surf - chức năng và các điểm đánh dấu tôi đã vẽ bằng cách sử dụng plot3-chức năng. Đối với mỗi điểm đánh dấu, tôi đã xác định một bản đồ màu giữa Đỏ-Vàng-Xanh tùy thuộc vào giá trị của điểm đánh dấu. Như bạn có thể thấy từ cốt truyện, colorbar đề cập đến khoảnh khắc bề mặt nhưng tôi muốn nó tham chiếu đến các điểm đánh dấu. Tôi có thể làm cái này như thế nào?

Cảm ơn bạn!

Dưới đây là MWe cơ bản hiển thị những gì tôi làm bây giờ:

% 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

Thực tiễn tốt để bao gồm [mcve] trong stackoverlfow. –

+0

Roger rằng, sắp tới :) – jjepsuomi

+0

Bạn có thể chỉ định điểm đánh dấu cho trục colormap (ở đây là thang độ xám) không? Nếu vậy, bạn có thể sử dụng kết cấu trên bề mặt để trông giống như hình lục giác ... – Crowley

Trả lời

3

Nếu bạn không dựa vào plot3 chức năng bạn có thể sử dụng scatter3 để thay thế.

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

Cảm ơn bạn @ Crowley :) Mục đích của biến ´c´ là gì? Tôi không thể nhìn thấy nó được sử dụng ở bất cứ nơi nào sau khi định nghĩa của nó. – jjepsuomi

+0

OK =) Tôi sẽ thử mã với dữ liệu của tôi :) Cảm ơn bạn rất nhiều! =) – jjepsuomi

+0

Tôi xin lỗi, màu sắc của các điểm bị ràng buộc với chiều cao không phải là giá trị ngẫu nhiên. Tôi đã chỉnh sửa mã để nó khớp với màu ngẫu nhiên và sử dụng biến 'c'. – Crowley

Các vấn đề liên quan