时间:2011-03-28 22:04:14

标签: wolfram-mathematica 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}}]

输出看起来像这样

enter image description here

它看起来应该是这样的

enter image description here

基本上,Histogram图形对象不服从FigurePanel的{​​{1}},而是服从主PlotRange的{​​{1}}。当Figure替换为PlotRange或类似命令时,不会发生此行为。所以下面会产生一个干净的情节

Histogram

enter image description here

还有其他人遇到过这个问题吗?或者,您有解决方案的建议吗?

修改

我以为我会在这个问题上添加一些绿色。我仍然有兴趣知道如何克服这个障碍。

3 个答案:

答案 0 :(得分:4)

好吧,我认为你不会太喜欢这个,但这是一种解决方法。

如果我将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

答案 1 :(得分:2)

正如Simon在评论中提到的,您可以使用LevelScheme的{​​{1}}来绘制直方图。

DataPlot

enter image description here

但是,我还没有设法得到像<< "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那样的直方图条,如果这也是你想要的那样。

BTW,函数BarChart类似于我很久以前在mathematica帮助论坛上看到的东西,它进入了我的有用函数工具包。我不记得我在哪里阅读或何时阅读它。然而,现在对我来说并不是一个神奇的功能,就像当时那样。

答案 2 :(得分:1)

我知道问题是什么,但我没有立即修复。 LevelScheme的工作方式是它转换Graphics个对象,使它们正确匹配。为此,RawGraphics使用TransformGraphics中的遗留函数LegacyPackages\Graphics\Graphics.mLegacyTransformGraphics.m包含在Level {1.51版LevelScheme软件包中的FullForm中。查看Histogram的{​​{1}},您可以看到TransformGraphics对处理所生成的对象一无所知。 Mark Caprio将在接下来的几个月内对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。它可能无法完全发挥作用,因为我没有看到替代选项的位置,但它应该是一个开始。