我正在尝试在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版本一起使用。如果有人能帮助我指出正确的方向,我将不胜感激!
答案 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).');