2015-04-14 18 views
10

Tôi muốn màu của từng mũi tên trong một ô quiver3 từ MATLAB tương ứng với độ lớn của mỗi mũi tên. Có cách nào để làm điều đó?quiver3 mũi tên màu tương ứng với độ lớn

Tôi đã xem một vài ví dụ trực tuyến có thể thực hiện việc này cho 2D quiver, tuy nhiên không có mẫu nào hoạt động cho biến thể 3D, quiver3.

Tôi có cốt truyện sau và muốn thay thế mũi tên màu xanh lam bằng màu tương ứng với độ lớn của chúng.

enter image description here

+0

Tôi e rằng đặt cược tốt nhất của bạn là sửa đổi [this] (http://www.mathworks.com/matlabcentral/fileexchange/3225-quiverc) gửi đến File Exchange để quản lý trường hợp 3D ... –

Trả lời

17

Trong hệ thống đồ họa cũ (R2014a trở về trước) này là không thể sử dụng được xây dựng trong quiver đối tượng. Bạn có thể dễ dàng có được tất cả các đối tượng âm mưu được sử dụng để soạn quiver cốt truyện

q = quiver(1:5, 1:5, 1:5, 1:5); 
handles = findall(q, 'type', 'line'); 

Nhưng đuôi đều được đại diện bởi một đối tượng âm mưu, và người đứng đầu mũi tên được đại diện bởi một. Do đó, bạn không thể thay đổi màu của mỗi đầu/đuôi riêng lẻ.

set(handles(1), 'Color', 'r') 
set(handles(2), 'Color', 'g') 

enter image description here

Tuy nhiên, với sự ra đời của HG2 (R2014b và sau), bạn có thể thực sự được tiếp cận với hai (không có giấy tờ) LineStrip đối tượng (matlab.graphics.primitive.world.LineStrip) (một đại diện cho người đứng đầu và một đại diện đuôi). Chúng có thể truy cập thông qua các thuộc tính ẩn TailHead.

q = quiver(1, 1, 1, 1); 
headLineStrip = q.Head; 
tailLineStrip = q.Tail; 

Sau đó bạn có thể thay đổi các thuộc tính màu sắc của các đối tượng này để làm cho mỗi mũi tên một màu khác nhau.

Ý tưởng cơ bản

Để làm điều này, tôi lần đầu tiên tính toán độ lớn của tất cả các mũi tên rung động (chỉ hoạt động này cho cả quiverquiver3)

mags = sqrt(sum(cat(2, q.UData(:), q.VData(:), ... 
      reshape(q.WData, numel(q.UData), [])).^2, 2)); 

Sau đó, tôi sử dụng bản đồ màu hiện tại để lập bản đồ mỗi độ richter với giá trị RGB. Mũi tên ngắn nhất được gán màu thấp nhất trên bản đồ màu và mũi tên dài nhất được gán màu cao nhất trên bản đồ màu. histcounts hoạt động tốt để gán cho mỗi độ lớn một chỉ mục có thể được chuyển đến ind2rgb cùng với bản đồ màu. Chúng ta phải nhân với 255 vì chúng ta cần màu RGB là số nguyên 8 bit.

% Get the current colormap 
currentColormap = colormap(gca); 

% Now determine the color to make each arrow using a colormap 
[~, ~, ind] = histcounts(mags, size(currentColormap, 1)); 

% Now map this to a colormap 
cmap = uint8(ind2rgb(ind(:), currentColormap) * 255); 

Các LineStripColorData tài sản (khi quy định như truecolor) cũng cần phải có một kênh alpha (mà chúng tôi sẽ thiết lập đến 255 nghĩa đục).

cmap(:,:,4) = 255; 

Tại thời điểm này thì chúng ta có thể thiết lập ColorBinding tài sản để interpolated hơn object (để tách nó ra khỏi đối tượng quiver) và thiết lập ColorData tài sản của cả q.Headq.Tail đến màu sắc, chúng tôi đã tạo ở trên cho mỗi mũi tên đó là màu sắc riêng.

Full Giải pháp

LƯU Ý: Giải pháp này làm việc cho cảquiverquiver3 và mã không nhất thiết phải được điều chỉnh ở tất cả.

%// Create a quiver3 as we normally would (could also be 2D quiver) 

x = 1:10; 
y = 1:10; 
[X,Y] = meshgrid(x, y); 
Z = zeros(size(X)); 
U = zeros(size(X)); 
V = zeros(size(X)); 
W = sqrt(X.^2 + Y.^2); 

q = quiver3(X, Y, Z, U, V, W); 

%// Compute the magnitude of the vectors 
mags = sqrt(sum(cat(2, q.UData(:), q.VData(:), ... 
      reshape(q.WData, numel(q.UData), [])).^2, 2)); 

%// Get the current colormap 
currentColormap = colormap(gca); 

%// Now determine the color to make each arrow using a colormap 
[~, ~, ind] = histcounts(mags, size(currentColormap, 1)); 

%// Now map this to a colormap to get RGB 
cmap = uint8(ind2rgb(ind(:), currentColormap) * 255); 
cmap(:,:,4) = 255; 
cmap = permute(repmat(cmap, [1 3 1]), [2 1 3]); 

%// We repeat each color 3 times (using 1:3 below) because each arrow has 3 vertices 
set(q.Head, ... 
    'ColorBinding', 'interpolated', ... 
    'ColorData', reshape(cmap(1:3,:,:), [], 4).'); %' 

%// We repeat each color 2 times (using 1:2 below) because each tail has 2 vertices 
set(q.Tail, ... 
    'ColorBinding', 'interpolated', ... 
    'ColorData', reshape(cmap(1:2,:,:), [], 4).'); 

enter image description here

Và áp dụng cho một đối tượng 2D quiver

enter image description here

Nếu bạn không nhất thiết muốn mở rộng quy mô các mũi tên để toàn bộ phạm vi của bản đồ màu bạn có thể sử dụng theo sau gọi tới histcounts (thay vì dòng trên) để lập bản đồ độ lớn bằng cách sử dụng giới hạn màu của các trục.

clims = num2cell(get(gca, 'clim')); 
[~, ~, ind] = histcounts(mags, linspace(clims{:}, size(currentColormap, 1))); 
6

Nếu bạn sử dụng một phiên bản bài r2014b bạn có thể sử dụng tính năng không có giấy tờ để thay đổi màu sắc của mỗi dòng và đầu:

figure 
[x,y] = meshgrid(-2:.5:2,-1:.5:1); 
z = x .* exp(-x.^2 - y.^2); 
[u,v,w] = surfnorm(x,y,z); 
h=quiver3(x,y,z,u,v,w); 

s = size(x); 
nPoints = s(1)*s(2); 
% create a colour map 
cmap = parula(nPoints); 
% x2 because each point has 2 points, a start and an end. 
cd = uint8(repmat([255 0 0 255]', 1, nPoints*2)); 
count = 0; 
% we need to assign a colour per point 
for ii=1:nPoints 
    % and we need to assign a colour to the start and end of the 
    % line. 
    for jj=1:2 
    count = count + 1; 
    cd(1:3,count) = uint8(255*cmap(ii,:)'); 
    end 
end 
% set the colour binding method and the colour data of the tail 
set(h.Tail, 'ColorBinding','interpolated', 'ColorData',cd) 

% create a color matrix for the heads 
cd = uint8(repmat([255 0 0 255]', 1, nPoints*3)); 
count = 0; 
% we need to assign a colour per point 
for ii=1:nPoints 
    % and we need to assign a colour to the all the points 
    % at the head of the arrow 
    for jj=1:3 
    count = count + 1; 
    cd(1:3,count) = uint8(255*cmap(ii,:)'); 
    end 
end 
% set the colour binding method and the colour data of the head 
set(h.Head, 'ColorBinding','interpolated', 'ColorData',cd) 

Lưu ý: Tôi đã không được thực hiện bất cứ điều gì thông minh với tầm quan trọng và đơn giản thay đổi màu sắc của mỗi rung động dựa trên thứ tự trong ma trận gốc - nhưng bạn sẽ có thể để có được những ý tưởng về cách sử dụng tính năng này ""

enter image description here

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