MATLAB R2018b中的颤动图箭头颜色(例如根据幅度)

时间:2018-10-05 20:24:41

标签: matlab matlab-figure

我正在尝试在MATLAB R2018b中生成2D / 3D颤动图,其中每个矢量的颜色对应于同一域中的某个标量场(例如每个矢量的大小)。

我知道有人问过before,确实收到了一个不错的solution(我已经使用了一段时间了)。但是,似乎R2018b对未记录的LineStrip类进行了一些更改,并且该解决方案不再起作用。箭头从图中被删除,我仅收到以下警告消息:

Warning: Error creating or updating LineStrip
 Error in value of property  ColorData
 Array is wrong shape or size 

不幸的是,LineStrip没有文档记录,这使我很难弄清楚如何修改较早的解决方案以使其与2018b版本一起使用。如果有人能帮助我指出正确的方向,我将不胜感激!

2 个答案:

答案 0 :(得分:0)

我之前遇到了相同的错误。我使用的是您引用的相同解决方案,但是由于我使用的是Matlab 2017a,因此这可能对您不起作用。

我遇到了与您相同的问题,而我的问题则源于错误地计算了向量的大小。检查您的mags向量的尺寸,并使用计算出的部分进行播放。这就是我的解决办法。

对不起,抱歉!

答案 1 :(得分:0)

我在尝试遵循相同的解决方案时也遇到了这个问题。我注意到运行确切的解决方案代码工作正常,但是在使用我自己的代码时,我会得到您描述的“错误形状”错误。问题原来是我的数据中的 NaN - quiver 不会将 NaN 添加到 Head.VertexData 因此您需要在调用 histcounts 之前从幅度数组中删除任何 NaN。我在这里重现错误:

x = 1:5;
y = 1:5;
[X,Y] = meshgrid(x, y);
Z = zeros(size(X));
U = zeros(size(X));
V = (x-1).*(y-1)';

% add a single NaN to recreate the issue
V(3,3) = nan;

q = quiver(X, Y, U, V);

%// Compute the magnitude of the vectors
mag = hypot(U(:), V(:));

%// Get the current colormap
vec_cmap = colormap('hot');

%// Now determine the color to make each arrow using a colormap
clims = num2cell([0, max(mag, [], 'all','omitnan')]);
[~, ~, ind] = histcounts(mag, linspace(clims{:}, size(vec_cmap, 1)));    
% [~, ~, ind] = histcounts(mag, size(vec_cmap, 1));

%// Now map this to a colormap to get RGB
cmap = uint8(ind2rgb(ind(:), vec_cmap) * 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).');
<块引用>

警告:错误创建或更新 LineStrip 值错误 属性 ColorData 数组的形状或大小错误
警告:创建或更新 LineStrip 时出错 属性 ColorData 的值出错 数组的形状或大小错误

然后是一个工作版本:

x = 1:5;
y = 1:5;
[X,Y] = meshgrid(x, y);
Z = zeros(size(X));
U = zeros(size(X));
V = (x-1).*(y-1)';

% add a single NaN to recreate the issue
V(3,3) = nan;

q = quiver(X, Y, U, V);

%// Compute the magnitude of the vectors
mag = hypot(U(:), V(:));

%// Get the current colormap
vec_cmap = colormap('hot');

%// Now determine the color to make each arrow using a colormap
clims = num2cell([0, max(mag, [], 'all','omitnan')]);
% Here is the solution - remove NaNs before binning
mag(isnan(mag)) = [];
[~, ~, ind] = histcounts(mag, linspace(clims{:}, size(vec_cmap, 1)));    
% [~, ~, ind] = histcounts(mag, size(vec_cmap, 1));

%// Now map this to a colormap to get RGB
cmap = uint8(ind2rgb(ind(:), vec_cmap) * 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).');

Coloured Quiver