在保持轴旋转的同时更新绘图?
Updating plot while maintaining axes rotations?
到目前为止,我有一个在 Kessel 运行 的 Monto-Carlo 模拟期间实时更新的 3d 图。我希望绘图在更新时可旋转,但启用 rotate3d
标志后,当我在更新绘图数据后调用 drawnow
时,它会将轴旋转重置为默认方向,取消用户更改的任何内容它到。我的相关代码如下:
s = scatter3(pg(:,1), pg(:,2), pg(:,3), 'O', 'filled');
set(s, 'MarkerEdgeColor', 'none', 'MarkerFaceColor', 'k');
hold on
p_x = curr_path(:,1);
p_y = curr_path(:,2);
p_z = curr_path(:,3);
p = plot3(p_x, p_y, p_z);
set(p, 'LineWidth', 2, 'Color', 'k');
p_x = longest.path(:,1);
p_y = longest.path(:,2);
p_z = longest.path(:,3);
p = plot3(p_x, p_y, p_z);
set(p, 'LineWidth', 2, 'Color', 'r');
p_x = shortest.path(:,1);
p_y = shortest.path(:,2);
p_z = shortest.path(:,3);
p = plot3(p_x, p_y, p_z);
set(p, 'LineWidth', 2, 'Color', 'b');
sample_str = sprintf('%d samples', sample);
short_str = sprintf('shortest: %g parsecs', shortest.dist);
long_str = sprintf('longest: %g parsecs', longest.dist);
title(sprintf('%s, %s, %s', sample_str, short_str, long_str));
xlim([-10 10]);
ylim([-10 10]);
zlim([-10 10]);
hold off
drawnow
每次我更新绘图上绘制的数据时都会执行此操作。我可以添加什么来确保在更新期间保持轴旋转?
希望我理解你的问题。好了,开始吧!
我想这个问题与使用 plot3
有关,它显然将图形的视图设置重置为其默认值。
我用以下程序验证了这一点:
figure;
x = randn(10,3);
p = plot3(x(:,1), x(:,2), x(:,3));
drawnow
pause; %// do rotations in the figure GUI, press a button when done
x = randn(10,3);
p = plot3(x(:,1), x(:,2), x(:,3)); %// rotations reset
drawnow;
pause
当暂停处于活动状态时,您可以旋转图形,但是当暂停被释放并且第二次调用 plot3
时,旋转设置将被重置。
避免重置的解决方案是直接更新已绘制图形对象中的XData
、YData
和ZData
。这可以通过以下方式实现:
figure;
x = randn(10,3);
p = plot3(x(:,1), x(:,2), x(:,3));
drawnow
pause; %// do rotations in the figure GUI, press a button when done
x = randn(10,3);
set(p, 'XData', x(:,1), 'YData', x(:,2), 'ZData', x(:,3)); %// no reset!
drawnow;
pause
所以无论你有什么代码,使用图形对象的句柄直接更新line properties以避免重置。
我遇到了同样的问题,在Matlab 2015b中你可以用这个简单的方法解决它。
[az,el] = view;
scatter3(x,y,z);
view(az,el);
drawnow
到目前为止,我有一个在 Kessel 运行 的 Monto-Carlo 模拟期间实时更新的 3d 图。我希望绘图在更新时可旋转,但启用 rotate3d
标志后,当我在更新绘图数据后调用 drawnow
时,它会将轴旋转重置为默认方向,取消用户更改的任何内容它到。我的相关代码如下:
s = scatter3(pg(:,1), pg(:,2), pg(:,3), 'O', 'filled');
set(s, 'MarkerEdgeColor', 'none', 'MarkerFaceColor', 'k');
hold on
p_x = curr_path(:,1);
p_y = curr_path(:,2);
p_z = curr_path(:,3);
p = plot3(p_x, p_y, p_z);
set(p, 'LineWidth', 2, 'Color', 'k');
p_x = longest.path(:,1);
p_y = longest.path(:,2);
p_z = longest.path(:,3);
p = plot3(p_x, p_y, p_z);
set(p, 'LineWidth', 2, 'Color', 'r');
p_x = shortest.path(:,1);
p_y = shortest.path(:,2);
p_z = shortest.path(:,3);
p = plot3(p_x, p_y, p_z);
set(p, 'LineWidth', 2, 'Color', 'b');
sample_str = sprintf('%d samples', sample);
short_str = sprintf('shortest: %g parsecs', shortest.dist);
long_str = sprintf('longest: %g parsecs', longest.dist);
title(sprintf('%s, %s, %s', sample_str, short_str, long_str));
xlim([-10 10]);
ylim([-10 10]);
zlim([-10 10]);
hold off
drawnow
每次我更新绘图上绘制的数据时都会执行此操作。我可以添加什么来确保在更新期间保持轴旋转?
希望我理解你的问题。好了,开始吧!
我想这个问题与使用 plot3
有关,它显然将图形的视图设置重置为其默认值。
我用以下程序验证了这一点:
figure;
x = randn(10,3);
p = plot3(x(:,1), x(:,2), x(:,3));
drawnow
pause; %// do rotations in the figure GUI, press a button when done
x = randn(10,3);
p = plot3(x(:,1), x(:,2), x(:,3)); %// rotations reset
drawnow;
pause
当暂停处于活动状态时,您可以旋转图形,但是当暂停被释放并且第二次调用 plot3
时,旋转设置将被重置。
避免重置的解决方案是直接更新已绘制图形对象中的XData
、YData
和ZData
。这可以通过以下方式实现:
figure;
x = randn(10,3);
p = plot3(x(:,1), x(:,2), x(:,3));
drawnow
pause; %// do rotations in the figure GUI, press a button when done
x = randn(10,3);
set(p, 'XData', x(:,1), 'YData', x(:,2), 'ZData', x(:,3)); %// no reset!
drawnow;
pause
所以无论你有什么代码,使用图形对象的句柄直接更新line properties以避免重置。
我遇到了同样的问题,在Matlab 2015b中你可以用这个简单的方法解决它。
[az,el] = view;
scatter3(x,y,z);
view(az,el);
drawnow