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

Wolfram mathematica 当使用鼠标旋转图像时,如何强制绘图在3D中使用特定的ImageSize,wolfram-mathematica,Wolfram Mathematica,(Mathematica版本:8.0.4,在Windows 7上) 有人能提醒我在以下情况下如何告诉M不要更改图像大小: 我有一个操纵,在这里我做了一个网格,在网格内,我要么显示一个图,要么显示两个图,这取决于控件的选择 为了保持显示的整体图像相同,如果显示一个绘图,则使用一个大小;如果显示两个绘图,则使用每个绘图长度的一半。到目前为止还很容易 奇怪的是,当我使用鼠标旋转一个绘图案例,然后切换回两个绘图时,绘图大小现在不使用我指定的ImageSize 似乎通过使用鼠标旋转一个绘图,它影响了同一屏

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

有人能提醒我在以下情况下如何告诉M不要更改图像大小:

我有一个操纵,在这里我做了一个网格,在网格内,我要么显示一个图,要么显示两个图,这取决于控件的选择

为了保持显示的整体图像相同,如果显示一个绘图,则使用一个大小;如果显示两个绘图,则使用每个绘图长度的一半。到目前为止还很容易

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

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

无论是否使用
spherecalregion->True
,都没有效果。使用
RotationAction->“Fit”
无效

这里有一个小例子来说明我的意思,然后我展示我目前是如何解决这个问题的。但我用GraphicsGrid代替网格来解决这个问题。如果可能的话,我想继续使用网格

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}
 ]
要重现这个问题,很简单:首先我注意大小,这就是我想要保持它的方式。现在我单击选项1,现在使用鼠标旋转一个绘图。现在我点击选项2返回,然后我看到绘图大小不是我预期的大小

我确信这是我需要使用的一个选项。只是还没找到

ps.实际上,似乎发生的是,旋转的同一个绘图保留在内容区域中,并在第二种情况下用于替代两个绘图中的一个。很奇怪。我一定是在什么地方做傻事,因为这太奇怪了

凌晨2:48更新 这是对在操作表达式中使用
Dynamic
的响应,如下所示。在V8.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}
 ]

凌晨3:03更新

下面的工作原理是保持网格。在网格周围添加框架可以使其正常工作。 (感谢Mike answer显示使用框架而不是网格使其工作,我想让我尝试在网格周围添加一个框架)

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


谢谢

我的时间不长,但是使用
网格
似乎是把事情搞砸的主要原因,尽管我还没有时间来确定如何/为什么。如果将
If
语句替换为以下内容:

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

那么它工作得很好。代码中还有其他一些事情乍一看似乎不是最优的,但由于时间限制,我只关注了图形大小。这不是一个解释,但可能会帮助您或其他人弄清楚为什么会出现这种情况。抱歉,时间太短,但我认为值得在没有进行任何实际分析的情况下发布关于
网格的观察结果,以下是我的猜测

我相信这可能是优化技术的结果,该技术观察到显示图形的外观内容没有改变。因此,我认为关键在于使显示在网格每个位置的每个图形之间的外观内容不同。使用类似于
Identity
的东西将不起作用,因为它将从表达式中消失。然而,如果这个猜测是正确的,我希望任何持续的变化都会导致一个更新的图形

在第一个
网格
表达式中,我成功地使用了其中的每一个:

Grid[{Framed@p},opt]

Grid[{Panel@p},opt]

Grid[{Pane@p},opt]

Grid[{{{p}}},opt]

Grid[{Item@p},opt]


Grid[{Style@p}},opt]

这与另一个谜题有关,即为什么Plot3D会记住图像选项。在这种情况下,解决方案也恰好相同:即,将
PreserveImageOptions->False
作为选项添加到
Plot3D
。不知何故,像MrW和Mike建议的那样的黑客迫使Plot3D“忘记”

我似乎记得以前见过这样的东西,但我找不到。我认为解决方案可能是使用GraphicsGrid,但您不希望这样。您可以通过将
Dynamic
添加到第二个
网格
来获得我认为您想要的行为,但我不太明白这里发生了什么,所以我需要探索一下。Wizard先生,是的,
GraphicsGrid
无法工作。无法使用鼠标旋转。至于关于将
动态
添加到第二个
网格
的其他评论,我现在不确定我是否理解了。在哪里?我试过了,但没能成功。谢谢。至少在v7中,它可以使行读为:
Grid[{{p},Sequence@opt], Dynamic@Grid[{p},{p},Sequence@opt]
--另外,
Sequence@x
相当于
x
;您可能需要
Sequence@@x
@Mr.Wizard,在v8.04中,如您所示添加
Dyanmic
是无效的。我现在正在添加更新,以便您可以看到。至于
序列
注释,我们将研究它。我可以移除它,不需要任何方式。谢谢。我刚刚找到一个黑客来保持网格并使其工作!多亏了Mike answer,我只需在
网格
周围放置一个
框架
,现在它就可以工作了!!太神了请参阅更新。谢谢。是的,这就解决了问题。但我真的很想使用网格,因为我的实际代码更复杂,我使用网格可以更好地控制间距和其他事情。网格是我所有东西的主要组成部分。但你能指出问题的原因。因此,我可以将此作为临时解决方法,同时尝试找出主要原因。但是我认为我仍然可以使用网格。我不明白为什么不。顺便说一句,这段代码只是一个5分钟的破解,只是为了显示我在主代码中看到的问题,它并不意味着是最优的:)再次感谢您的帮助。我是s
If[choice == 1, Framed@p, Grid[{{p}, {p}}, Sequence@opt]]