自适应网格线
|
我想使用网格线在2d图形上创建毫米级方格纸的效果,以显示多变量函数如何依赖于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个元素,则图将为(对元素进行排序并添加回归线)。
注意最左边的元素就像离网。
没有找到相关结果
已邀请:
3 个回复
亨尖玛次酥
使用适合于网格的AspectRatio(可能是x和y范围的比率) 饭后更新 为了使它对于不同的值范围更加健壮(根据您的评论),我生成了将由
选择的刻度,并基于此进行设置:
并获得产生正方形光栅的长宽比
测试
在这里,我将y值除以20,然后将x值乘以10000以显示网格仍然良好: 最终更新(我希望) 这将使用belisarius建议的FindDivisions。但是,我按照Margus的要求使用了三级线结构标准的军用纸:
和
警告!!! 我只是注意到,如果您在MMA中有此功能: 然后将其复制到SO(仅ctrl-c ctrl-v),您将得到以下信息:
这在数学上不是等效的。应该是这样的:
我已在上面的代码中更正了此问题,但是在我的计算机上正常工作时,它已发布了半天错误。认为最好提一下。
剑哎
扭湘阀柿蹄
和
使用相同的功能,它们会对齐。 请参见FrameTicks和GridLines。我想你需要18英镑作为边界。