【问题标题】:How to update plot data and color map in Octave?如何在 Octave 中更新绘图数据和颜色图?
【发布时间】:2016-08-26 20:16:55
【问题描述】:

我有一个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

【问题讨论】:

  • 这听起来是个有趣的问题。如果您想提供一个最小的工作示例,我很乐意看看。
  • 如果我不得不猜测,我会说颜色数据驻留在 CData 数组中。看看 CData / CDataMode / CDataMapping / CDataSource 属性
  • 这怎么可能for t = 0:1000:10
  • @NKN,因为该表达式会生成一个向量 t,范围从 010,步骤为 1000
  • @NKN 哇哦,你是对的,我想错了,几个月没碰过这种语言。我的问题仍然存在,我只是在这里的示例中输入了错误

标签: matlab plot octave colormap


【解决方案1】:

tl;dr:改变

set(p, 'ZData', z);

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


说明

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

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

可惜octave没有提供这个属性,所以如果手动设置zdata为别的,还需要自己手动更新颜色信息。但是,由于无论如何这只是基于z,您所要做的就是将CData 更新为与ZData 相同的值。

很明显,如果您每次都从头开始绘制对象,则不会遇到此问题,但最好按照自己的方式绘制,因为它的动画速度更快,更流畅(在八度音阶中 很多出于某种原因的事实!),并且您不会因必须再次绘制轴等而重绘副作用,所以这是一个好问题!非常感谢!

【讨论】:

  • octave 团队通常将这种与 matlab 的偏差视为错误,因为他们的目标是使语言完全兼容,所以我鼓励你 file a bug :)
【解决方案2】:

问题在于更改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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多