使用鼠标旋转图像时,如何强制Plot在3D中使用特定的ImageSize

Nas*_*ser 6 wolfram-mathematica

(Mathematica版本:8.0.4,在Windows 7上)

有人可以提醒我如何告诉M在以下情况下不要更改ImageSize:

我有一个Manipulate,我制作一个网格,在网格内部,我要么显示一个图,要么显示2个图,具体取决于控件的选择.

为了保持整体显示的图像相同,如果我显示一个图我使用一个尺寸,如果我显示2个图,我使用每个图的一半长度.到目前为止很容易.

奇怪的是,当我使用鼠标旋转一个绘图案例,然后切换回2个绘图时,绘图大小现在不使用我指定的ImageSize.

似乎通过使用鼠标旋转一个绘图,它影响了同一屏幕位置上显示的下一个绘图.

使用SphericalRegion -> True与否,没有效果.使用RotationAction -> "Fit"没有效果.

这是我的意思的一个小例子,然后我展示了我目前如何解决这个问题.但我通过使用GraphicsGrid代替Grid来解决它.如果可能的话,我想继续使用Grid.

Manipulate[
 Module[{opt = {Spacings -> {0, 0}, Frame -> All}, p,
   size, data = Table[RandomReal[], {10}, {10}], wid = 300, len = 300},

  size = If[choice == 1, {wid, len}, {wid, len/2}];
  Print[size];
  p = ListPlot3D[data,SphericalRegion->True,ImagePadding -> 10,ImageSize ->size];

  If[choice == 1,
   Grid[{{p}}, Sequence@opt], Grid[{{p}, {p}}, Sequence@opt]
   ]
  ],

 Row[{SetterBar[Dynamic[choice], {1, 2}]}],
 {{choice, 2}, None}
 ]
Run Code Online (Sandbox Code Playgroud)

要重现这个问题,很简单:首先我要注意尺寸,这就是我想保留它的方式.现在我点击选项1,现在使用鼠标旋转一个图.现在我点击选择2返回,然后我看到情节大小不是我预期的.

在此输入图像描述

我确信这是我需要使用的选项.还没找到它.

PS.实际上似乎发生的是,旋转的SAME图,停留在内容区域,并用于代替第二种情况下的2个图中的一个.很奇怪.我必须在某个地方做些傻事,因为这太奇怪了.

更新2:48 am 这是对DynamicMrWizard下面Manipulate表达式的使用的回应.在V 8.04上,它不起作用.这是代码:

Manipulate[
 Module[{p, size, data = Table[RandomReal[], {10}, {10}], wid = 300, 
   len = 300},

  size = If[choice == 1, {wid, len}, {wid, len/2}];
  p = ListPlot3D[data, SphericalRegion -> True, ImagePadding -> 10, 
    ImageSize -> size];

  If[choice == 1,
   Grid[{{p}}],
   Dynamic@Grid[{{p}, {p}}]
   ]
  ],

 Row[{SetterBar[Dynamic[choice], {1, 2}]}],
 {{choice, 2}, None}
 ]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

更新3:03 am

以下通过保持网格来工作.在网格周围添加框架使其有效.(感谢Mike回答显示使用Frame代替Grid使其工作,我想让我尝试在网格周围添加一个框架)

我用Mathematica很长时间看到的最奇怪的事情之一:)

Manipulate[
 Module[{p, size, data = Table[RandomReal[], {10}, {10}], wid = 300, 
   len = 300},

  size = If[choice == 1, {wid, len}, {wid, len/2}];
  p = ListPlot3D[data, SphericalRegion -> True, ImagePadding -> 10, 
    ImageSize -> size];

  If[choice == 1,
   Framed@Grid[{{p}}],
   Grid[{{p}, {p}}]
   ]
  ],

 Row[{SetterBar[Dynamic[choice], {1, 2}]}],
 {{choice, 2}, None}
 ]
Run Code Online (Sandbox Code Playgroud)

谢谢

kgl*_*glr 5

这涉及到另一个谜题再怎么//为什么PLOT3D格式记得图像选项为什么PLOT3D格式记得.......在这种情况下,解决方案恰好相同:即添加PreserveImageOptions -> False为选项Plot3D.不知何故,像MrW和Mike建议的黑客强迫Plot3D"忘记".