Графики гистограммы в LevelScheme - PullRequest
6 голосов
/ 29 марта 2011

Я только начал использовать LevelScheme , и у меня возникли проблемы с корректным размещением гистограммы на рисунке.Минимальный нерабочий пример:

<<"LevelScheme`"
Figure[{FigurePanel[{{0, 1}, {0, 1}},
   LabB -> textit["x"], BufferB -> 2.5,
   LabL -> textit["p(x)"], BufferL -> 2.5,
   FrameTicks -> {LinTicks[-4, 4], LinTicks[0, 1]},
   PlotRange -> {{-3, 3}, {0, 0.5}}], 
  RawGraphics[
   Histogram[RandomReal[NormalDistribution[], 1000], Automatic, 
    "ProbabilityDensity"]]},
 Frame -> False, PlotRange -> {{-0.075, 1.1}, {-0.1, 1.03}}]

Вывод выглядит следующим образом

enter image description here

, когда он должен выглядеть следующим образом

enter image description here

По сути, графический объект Histogram не подчиняется FigurePanel PlotRange, но вместо этого подчиняется основным Figure * PlotRange.Такое поведение не возникает, когда Histogram заменяется Plot или подобными командами.Таким образом, следующее дает чистый участок

Figure[{FigurePanel[{{0, 1}, {0, 1}},
   LabB -> textit["x"], BufferB -> 2.5,
   LabL -> textit["p(x)"], BufferL -> 2.5,
   FrameTicks -> {LinTicks[-4, 4], LinTicks[0, 1]},
   PlotRange -> {{-3, 3}, {0, 0.5}}], 
  RawGraphics[Plot[1/Sqrt[2 Pi] Exp[-x^2/2], {x, -4, 4}]]},
 Frame -> False, PlotRange -> {{-0.075, 1.1}, {-0.1, 1.03}}]

enter image description here

Кто-нибудь еще сталкивался с этой проблемой?Или у вас есть предложения по исправлению?

РЕДАКТИРОВАТЬ

Я думал, что добавлю немного зеленого в вопрос.Мне все еще интересно узнать, как преодолеть это препятствие.

Ответы [ 3 ]

4 голосов
/ 27 апреля 2011

Ну, я так понимаю, вам это не понравится, но это своего рода обходной путь.

Если я даю PerformanceGoal -> "Speed" в качестве опции гистограммы (вместо PerformanceGoal -> "Quality"), я отключаю интерактивное поведение, но, с небольшими изменениями, я получаю следующее:

<< "LevelScheme`"
Figure[{FigurePanel[{{0, 1}, {0, 1}}, LabB -> textit["x"], 
   BufferB -> 2.5, LabL -> textit["p(x)"], BufferL -> 2.5, 
   FrameTicks -> {LinTicks[-4, 4], LinTicks[0, 1]}, 
   PlotRange -> {{-3, 3}, {0, 0.55}}], 
  RawGraphics[
   Histogram[RandomReal[NormalDistribution[], 1000], Automatic, 
    "ProbabilityDensity", PerformanceGoal -> "Speed"]]}, 
 Frame -> False, PlotRange -> {{-0.075, 1.1}, {-0.15, 1.1}}]

enter image description here

2 голосов
/ 27 апреля 2011

Как отметил Саймон в комментарии, вы можете использовать LevelScheme DataPlot для построения гистограммы.

<< "LevelScheme`"
histData[x_] := 
  Cases[x, RectangleBox[{bl_, _}, {br_, c_}] :> {{bl, br}, c}, 
   Infinity];
hist = histData[
   Histogram[RandomReal[NormalDistribution[], 1000], {-4, 4, 0.1}, 
    "ProbabilityDensity"]];
bins = hist[[All, 1, 1]]; counts = hist[[All, 2]];
data = Table[{bins[[i]], counts[[i]]}, {i, 1, Length@counts}];

Figure[{FigurePanel[{{0, 1}, {0, 1}}, LabB -> textit["x"], 
   BufferB -> 2.5, LabL -> textit["p(x)"], BufferL -> 2.5, 
   FrameTicks -> {LinTicks[-4, 4], LinTicks[0, 1]}, 
   PlotRange -> {{-3, 3}, {0, 0.5}}],
  DataPlot[data, 
   DataLine -> {LineShape -> "Histogram", LineColor -> Darker@Blue}, 
   DataSymbol -> {SymbolSize -> 0.00001}],
  RawGraphics[
   Plot[1/Sqrt[2 Pi] Exp[-x^2/2], {x, -4, 4}, 
    PlotStyle -> {Red, Thick}]]
  }, Frame -> False, PlotRange -> {{-0.075, 1.1}, {-0.1, 1.03}}]

enter image description here

Однако мне не удалось получить заполненные гистограммы, подобные тем, которые были получены с помощью Histogram или BarChart, если это было также тем, что вы намеревались.

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

1 голос
/ 29 марта 2011

Я знаю, в чем проблема, но у меня нет немедленного решения. Способ работы LevelScheme заключается в том, что он преобразует объекты Graphics так, чтобы они правильно помещались. Для этого RawGraphics использует устаревшую функцию TransformGraphics из LegacyPackages\Graphics\Graphics.m, которая включена в LegacyTransformGraphics.m в версии 3.51 пакетов LevelScheme. Глядя на FullForm вашего Histogram, вы можете видеть, что TransformGraphics ничего не знает о том, как иметь дело с производимыми объектами. Марк Каприо работает над обновлением LevelScheme в течение следующих нескольких месяцев, так что может быть исправлено. В то же время, попробуйте использовать Rasterize перед тем, как поставить свою гистограмму на RawGraphics, хотя это может не дать вам хороших результатов.

Редактировать : Вместо использования устаревшей версии TransformGraphics более свежая версия может выглядеть как

TransformGraphics[ 
  (g:(Graphics | Graphics3D))[prims__, opts:OptionsPattern[], transform_]:=
    g[ GeometricTransformation[prims, transform], opts ]

Конечно, теперь трюк предоставляет версию transform, которую GeometricTransformation может принять. Хотя устаревшая TransformGraphics применяет функцию, ее второй аргумент непосредственно к точкам, найденным в g, поэтому использование приведенного выше кода может работать без каких-либо дополнительных изменений.

Чтобы попробовать, замените Needs["LevelScheme`LegacyTransformGraphics`"] приведенным выше кодом в LevelScheme.nb (и регенерируйте LevelScheme.m) или непосредственно в LevelScheme.m. Это может работать не полностью, так как я не вижу, где подставляются варианты, но это должно быть начало.

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