如何在 Octave 中更新绘图数据和颜色图?

How to update plot data and color map in Octave?

我有一个绘制二维函数的 surf 图。我有一个循环,它更改 meshgrid 矩阵中每个点 [x,y]z 值,以便为我的情节设置动画:

p = surf(x, y, z)
frames = 10/1000

for t = 0:frames:10
    newZ = updateZVal(someArgs)
    set(p, 'ZData', newZ)

这在大多数情况下工作正常。但是,颜色图不会更新。基本上,原始 z 矩阵的颜色贴图纹理就保留在那里。 x-y平面随着newZ的变化而上下移动,但颜色不变。

这段代码在 Matlab 中工作正常,在 Octave 中工作正常,除了这个颜色问题。

编辑:最小工作示例。小移动高斯类型的东西。可以看到颜色没有更新

figure();

x_range = [-2:0.2:2];
y_range = [-2:0.2:2];
[x,y] = meshgrid(x_range, y_range);
frames = 500;
z = (x) .* y;

p = surf(x, y, z);

for t = [0:2/frames:2]
    z = exp(-((((x-t).^2)/2) + (((y-t).^2)/2)));
    set(p, 'ZData', z);
    drawnow;
end

问题是更改 Z 数据不会更改冲浪图中的颜色。相反,您应该使用一个矩阵 C,假设其大小与 Z 相同,为表面着色。有关定义 C 的信息,请参阅 Coloring Mesh and Surface Plots

检查这个例子:

[X,Y,Z] = peaks(25);
figure;
p = surf(X,Y,Z,gradient(Z));
for t = 0:1:10
    newZ = Z*rand(size(Z));
    p = surf(X,Y,newZ,gradient(newZ));
    pause(0.5);
end

tl;dr:改变

set(p, 'ZData', z);

set(p, 'ZData', z, 'CData', z);


解释

感谢您提供最简单的工作示例!

颜色似乎没有在八度内自动更新的原因是因为在 matlab 中,surf 对象似乎提供了一个额外的 属性,称为 cdatamode,其中 cdata是颜色数据,cdatamode的默认值为auto,即如果发生变化,自动从zdata更新颜色信息。

可惜octave不提供这个属性,所以如果你手动设置zdata为别的,你也需要自己手动更新颜色信息。但是,由于这只是基于 z,所以您所要做的就是使用与 ZData.

相同的值更新 CData

很明显,如果你每次都从头开始绘制对象,你就不会遇到这个问题,但按你的方式做是更可取的,因为它制作动画更快更流畅(a lot 实际上由于某种原因在八度音程中更快!),并且您不会因为必须再次绘制轴等而重新绘制副作用,所以这是一个很好的问题!非常感谢!