我刚刚开始使用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
图形对象不服从FigurePanel
的{{1}},而是服从主PlotRange
的{{1}}。当Figure
替换为PlotRange
或类似命令时,不会发生此行为。所以下面会产生一个干净的情节
Histogram
还有其他人遇到过这个问题吗?或者,您有解决方案的建议吗?
修改
我以为我会在这个问题上添加一些绿色。我仍然有兴趣知道如何克服这个障碍。
答案 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}}]
答案 1 :(得分:2)
正如Simon在评论中提到的,您可以使用LevelScheme
的{{1}}来绘制直方图。
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
类似于我很久以前在mathematica帮助论坛上看到的东西,它进入了我的有用函数工具包。我不记得我在哪里阅读或何时阅读它。然而,现在对我来说并不是一个神奇的功能,就像当时那样。
答案 2 :(得分:1)
我知道问题是什么,但我没有立即修复。 LevelScheme的工作方式是它转换Graphics
个对象,使它们正确匹配。为此,RawGraphics
使用TransformGraphics
中的遗留函数LegacyPackages\Graphics\Graphics.m
,LegacyTransformGraphics.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。它可能无法完全发挥作用,因为我没有看到替代选项的位置,但它应该是一个开始。