Графики гистограмм в LevelScheme

Я только начал использовать 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}}]

Вывод выглядит так

введите здесь описание изображения

когда это должно выглядеть так

введите здесь описание изображения

По сути, графический объект Histogram не подчиняется PlotRange FigurePanel, а вместо этого подчиняется основному 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}}]

введите здесь описание изображения

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

ИЗМЕНИТЬ

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


person Community    schedule 28.03.2011    source источник
comment
Можете ли вы нарисовать гистограмму с помощью DataPlot от LevelScheme?   -  person Simon    schedule 29.03.2011
comment
@Simon: я пробовал, и это не сработало. Похоже, что его функциональность аналогична ListLinePlot.   -  person    schedule 29.03.2011
comment
о'б: ок. Что хорошо в LevelScheme, так это то, что код полностью открыт, так что, возможно, вы поймете, почему он не работает с гистограммой...   -  person Simon    schedule 29.03.2011


Ответы (3)


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

Если я укажу 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}}]

введите здесь описание изображения

person tomd    schedule 27.04.2011
comment
Это довольно аккуратно! Не догадался бы, что отключение интерактивного поведения исправит это. - person abcd; 27.04.2011
comment
PerformanceGoal -> "Speed" как-то снижает качество графика или только убирает сахар? - person Mr.Wizard; 28.04.2011
comment
СЛАДКИЙ! У меня еще есть 5 дней на награду, но я думаю, что вы заслужили это за короткое и простое решение! Наслаждайтесь +100 и новыми привилегиями, которые приходят вместе с 1000 репутации. - person ; 29.04.2011
comment
@d'o-o'b Спасибо :-) И спасибо за размещение вопроса. LevelScheme действительно превосходна. Я не использовал его раньше, но теперь я нахожу его очень полезным. - person tomd; 29.04.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}}]

введите здесь описание изображения

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

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

person abcd    schedule 26.04.2011
comment
йода, поздравляю с 4000 реп - person Mr.Wizard; 27.04.2011
comment
спасибо :) ты почти у цели... Держу пари, к концу дня тоже. Этим утром я был близок к 4200, но потом я узнал о пересчете повторений, который можно запускать каждый день, и потерял около 100+ повторений, когда пытался. Они были из удаленных ответов, за которые проголосовали :( Ну, я знал, что это произойдет. - person abcd; 27.04.2011
comment
спасибо вам, но думаю, не сегодня. Я сейчас в режиме спрашивать и размышлять, и не отвечаю на многие вопросы. - person Mr.Wizard; 27.04.2011
comment
@yoda: я уже пробовал это, и это сработало. Смотрите мои комментарии к сообщению rcollyer, где я упоминаю об этом. Я пытаюсь воссоздать стиль сюжета Histogram. Что было бы действительно здорово, так это иметь возможность вызывать RawGraphics[Histogram[...]] напрямую вместо объединения/подсчета и т. д. - person ; 27.04.2011
comment
@yoda: с версии 8 ваш dataHist стал лишним. Теперь есть HistogramList. До v8 вы могли использовать необязательный третий аргумент Histogram для получения биннинга и подсчета данных следующим образом: Reap[Histogram[RandomReal[NormalDistribution[0, 1], 200], Automatic, (Sow[{#1, #2}]; #2) &]] - person Sjoerd C. de Vries; 27.04.2011
comment
@Sjoerd: я все еще использую v7, поэтому не знал о HistogramList. Кроме того, метод Reap и Sow задокументирован в файле справки mma Histogram, и я использовал его несколько раз. Однако, если я правильно помню, это не сработало, когда я использовал третий аргумент для Histogram, который в данном случае равен "ProbabilityDensity". Конечно, я мог бы сам рассчитать плотность проб на основе количества бинов, или, может быть, мне просто нужно было внести небольшое изменение, чтобы получить желаемый результат. Вместо этого я воспользовался ленивым подходом и вытащил старую функцию, которая работала :) - person abcd; 27.04.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. Это может не работать полностью, так как я не вижу, где подменяются параметры, но это должно быть началом.

person rcollyer    schedule 29.03.2011
comment
Спасибо за информацию, rcollyer. Rasterize не очень помогло, но я попытался поиграть с предложением Саймона использовать DataPlot. У него есть режим гистограммы, который на данный момент выполняет свою работу (хотя его настройка требует больше усилий, чем Histogram). - person ; 29.03.2011
comment
Жаль слышать, что Rasterize не сработало, хотя я думал, что это будет далеко. После просмотра кода я не думаю, что исправление очень сложно реализовать, но оно требует выяснения того, как LevelScheme масштабирует графику, чего я еще не сделал. :) Но я отправил Марку по электронной почте по крайней мере часть предложенного исправления, хотя оно включает в себя переоснащение некоторых основ LevelScheme. - person rcollyer; 29.03.2011
comment
Теперь он ничего не отображает, выдавая ошибку 0, это не графический примитив (я использую v7, если это имеет значение). Я попробую поиграть с ним, чтобы увидеть, смогу ли я заставить его работать. Спасибо, что указали мне правильное направление. - person ; 30.03.2011
comment
гррр... надо разобраться, когда будет больше времени. Дайте мне знать, если у вас получится. Я также использую версию 7, и нет, я не проверял ее, прежде чем предлагать. - person rcollyer; 30.03.2011