Как заставить Plot использовать указанный ImageSize в 3D при использовании мыши для поворота изображения - PullRequest
6 голосов
/ 27 декабря 2011

( Mathematica версия: 8.0.4, в Windows 7)

Может кто-нибудь напомнить, как сказать M не изменять ImageSize в следующем случае:

У меня есть Манипуляция, где я делаю сетку, и внутри сетки я либо показываю один график, либо 2 графика, в зависимости от выбора элемента управления.

Чтобы сохранить общее отображаемое изображение таким же, затемесли я отображаю один график, я использую один размер, а если я отображаю 2 графика, я использую половину длины для каждого графика.Пока все достаточно просто.

Странно то, что когда я использую мышь, чтобы повернуть случай с одним графиком, а затем переключиться обратно на 2 графика, размер графика теперь не использует указанный мной размер изображения.

Кажется, с помощью мыши, чтобы повернуть один график, это повлияло на следующий график, показанный в том же месте экрана.

Использование 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}
 ]

Чтобы воспроизвести проблему, все просто: сначала я отмечаю размер, вот как я хочу сохранить его.Теперь я нажимаю на выбор 1, теперь с помощью мыши поворачиваю один сюжет.Теперь я нажимаю на вариант 2, чтобы вернуться, и я вижу, что размер графика не соответствует ожидаемому.

enter image description here

Я уверен, что это вариант, который мне нужениспользовать.Просто еще не нашел.

пс.На самом деле, похоже, происходит то же самое, что тот же график, который был повернут, остается в области содержимого и использовался вместо одного из 2 графиков во втором случае.Очень странно.Должно быть, я где-то что-то делаю глупо, потому что это слишком странно.

Обновление 2:48 * Это ответ на использование Dynamic в выражении Manipulate, как показано ниже MrWizard.На 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}
 ]

enter image description here

Обновление 3:03

Это ниже работает, сохраняя сетку.Добавление рамки вокруг сетки делает это работает.(Благодаря ответу Майка, показывающему, что использование Frame вместо Grid заставило его работать, я решил, что попытаюсь добавить 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}
 ]

Спасибо

Ответы [ 3 ]

5 голосов
/ 27 декабря 2011

Это связано с другой загадкой: // почему Plot3D запоминает параметры изображения почему Plot3D запоминает ... . Решение оказывается таким же и в этом случае: добавьте PreserveImageOptions -> False в качестве опции к Plot3D. Каким-то образом взломы, подобные тем, которые предложили MrW и Майк, заставляют Plot3D «забыть».

2 голосов
/ 27 декабря 2011

У меня не получилось долго, но использование Grid, кажется, главное, что все испортило, хотя у меня не было времени определить, как и почему Если вы замените оператор If следующим:

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

тогда все работает нормально. В коде происходят некоторые другие вещи, которые на первый взгляд не кажутся оптимальными, но я только сосредоточился на размере графики из-за нехватки времени. Это не предназначено для объяснения, но может помочь вам или кому-то еще понять, почему это так. Извините, но не успел, но подумал, что стоит опубликовать наблюдение о Grid.

1 голос
/ 27 декабря 2011

Не делая никакого реального анализа, вот моя гипотеза.

Я полагаю, что это может быть результатом техники оптимизации, которая отмечает, что видимое содержание отображаемой графики не изменилось. Поэтому я полагаю, что ключ состоит в том, чтобы сделать видимое содержание различным для каждого графического объекта, отображаемого в каждой позиции таблицы. Использование что-то вроде Identity не будет работать, так как оно исчезает из выражения. Однако, если эта гипотеза верна, я ожидаю, что любое постоянное изменение приведет к обновленной графике.

Я успешно использовал каждое из них для первого Grid выражения:

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...