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')
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 Tail
và Head
.
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ả quiver
và quiver3
)
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 LineStrip
ColorData
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.Head
và q.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ảquiver
và quiver3
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).');
Và áp dụng cho một đối tượng 2D quiver
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)));
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 ... –