【发布时间】:2025-12-02 00:00:02
【问题描述】:
我想使用网格线在二维图形上创建millimeter graphing paper 的效果,以显示多变量函数如何依赖于 1 个变量。不同变量的尺度差异很大,所以我的幼稚方法(我以前使用过)似乎不起作用。
我目前拥有的示例:
<< ErrorBarPlots`
Cmb[x_, y_, ex_, ey_] := {{N[x], N[y]}, ErrorBar[ex, ey]};
SetAttributes[Cmb, Listable];
ELP[x_, y_, ex_, ey_, name_] :=
ErrorListPlot[
Cmb[x, y, ex, ey],
PlotRange -> FromTo[x, y],
PlotLabel -> name,
Joined -> True, Frame -> True, GridLines -> GetGrid,
ImageSize -> {600}
]
FromTo(我想在框架中留出 5% 的边距)和 GetGrid 都不能完全按照我的意愿工作。
在某些轴上,变量相差 10 的多个数量级。而且我不希望一个轴比另一个轴有多个 10 个网格线的数量级。最重要的是,我希望网格线与刻度线对齐。
样本数据:
ELP[
{4124961/25000000, 27573001/100000000, 9162729/25000000, 44635761/
100000000, 15737089/25000000, 829921/1562500, 4405801/4000000,
23068809/25000000, 329386201/100000000, 58079641/100000000},
{1/10, 1/5, 3/10, 2/5, 3/5, 1/2, 1/2, 1/2, 1/2, 1/2},
{2031/(250000 Sqrt[10]), 5251/(500000 Sqrt[10]), 3027/(
250000 Sqrt[10]), 6681/(500000 Sqrt[10]), 3967/(250000 Sqrt[10]),
911/(62500 Sqrt[10]), 2099/(100000 Sqrt[10]), 4803/(
250000 Sqrt[10]), 18149/(500000 Sqrt[10]), 7621/(500000 Sqrt[10])},
{1/2000, 1/1000, 3/2000, 1/500, 3/1000, 1/400, 1/400, 1/400, 1/400,
1/400},
"T2, m"
]
会导致:
还有我天真的 GetGrid,它在某种意义上是有效的:
FromTo[x_, y_] := Module[{dx, dy},
dx = (Max[x] - Min[x])*0.1;
dy = (Max[y] - Min[y])*0.1;
{{Min[x] - dx, Max[x] + dx}, {Min[y] - dy, Max[y] + dy}}];
GetGrid[min_, max_] := Module[{step, i},
step = (max - min)/100;
Table[
{min + i*step,
If[Equal[Mod[i, 10], 0],
Directive[Gray, Thick, Opacity[0.5]],
If[Equal[Mod[i, 5], 0],
Directive[Gray, Opacity[0.5]],
Directive[LightGray, Opacity[0.5]]
]]},
{i, 1, 100}]
]
问题
如何使 GridLines 与刻度对齐?
编辑:使用
GetTicks[x_, y_] := Module[{dx, dy},
dx = (Max[x] - Min[x])*0.1;
dy = (Max[y] - Min[y])*0.1;
{
Min[x] - dx + Table[i*dx*1.2, {i, 1, 9}],
Min[y] - dy + Table[i*dy*1.2, {i, 1, 9}]
}];
ELP[x_, y_, ex_, ey_, name_] :=
ErrorListPlot[
Cmb[x, y, ex, ey],
PlotRange -> FromTo[x, y],
PlotLabel -> name,
Joined -> True, Frame -> True, GridLines -> GetGrid,
FrameTicks -> GetTicks[x, y],
ImageSize -> {600},
AspectRatio -> 1
]
我可以得到:
这好多了。但我想移动网格而不是刻度。
编辑:@Sjoerd C. de Vries
您的解决方案完成了我想要归档的工作。我还注意到,如果我取样本数据的前 5 个元素,那么绘图将是(对元素进行排序并添加回归线)。
注意最左边的元素就像离网一样。
【问题讨论】:
-
您可能还想插入 Needs["ErrorBarPlots
"] for completeness. Do you intend the gridlines to form a square raster? In that case you have to play withAspectRatio`。 -
@Sjoerd C. de Vries:是的,你的权利。
-
如果你想指定刻度线的位置,我建议使用LevelScheme。它的
CustomTicks包远远优于内置功能,而且您不必自己编写容易出错的代码来设置自定义规范。 -
@rcollyer : 有趣的资源。
-
显然,自定义网格线应该在 LevelScheme 的下一个版本中。不过,我不知道它是否能够支持三个级别的样式。