在Mathematica Plot中强制x轴与y轴对齐

时间:2011-09-30 20:56:12

标签: wolfram-mathematica plot

在Mathematica中,当我有时候绘制东西时,我并不总是让x轴与绘图的确切底部对齐。有什么方法可以强迫它一直这样做吗?

以下是我所谈论的一个例子:http://i.imgur.com/3lcWd.png

我希望x轴与底部的零刻度标记方式完美对齐,而不是在y轴的中间,就像在该图像中一样。

我能以任何方式完成这项任务吗?

4 个答案:

答案 0 :(得分:9)

使用选项AxesOrigin -> {0,0}

答案 1 :(得分:5)

以下将在左侧和底部绘制轴,与坐标值无关:

aPlot[f_, var_, opts : OptionsPattern[]] :=
 Plot[f, var,
  AxesOrigin -> 
   First /@ (# /. AbsoluteOptions[Plot[f, var, opts], #] &@PlotRange), opts]

aPlot[Evaluate[Table[BesselJ[n, x], {n, 4}]], {x, 0, 10}, Filling -> Axis]

enter image description here

aPlot[Sin[x], {x, 0, 2 Pi}]

enter image description here

答案 2 :(得分:4)

您还可以使用以下内容:Frame -> {{Automatic, None}, {Automatic, None}}

(另外我认为默认情况下不选择{0,0}意味着y=0会被PlotRangePadding带入范围。所以这可能是另一个值得关注的选项。)

答案 3 :(得分:1)

这是基于belisarius代码的(IMO)更优雅的方法,它使用DisplayFunction选项(参见here关于此选项的有趣讨论):

Plot[Evaluate[Table[BesselJ[n, x], {n, 4}]], {x, 0, 10}, 
 Filling -> Axis, 
 DisplayFunction -> 
  Function[{plot}, 
   Show[plot, 
    AxesOrigin -> 
     First /@ (PlotRange /. AbsoluteOptions[plot, PlotRange]), 
    DisplayFunction -> Identity]]]

这两种方法的唯一缺点是AbsoluteOptions does not always give correct value of PlotRange。解决方案是使用the Ticks hack(这会为完整的PlotRange添加明确的PlotRangePadding值}:

completePlotRange[plot_] := 
 Last@Last@
   Reap[Rasterize[
     Show[plot, Ticks -> (Sow[{##}] &), DisplayFunction -> Identity], 
     ImageResolution -> 1]]
Plot[Evaluate[Table[BesselJ[n, x], {n, 4}]], {x, 0, 10}, 
 Filling -> Axis, 
 DisplayFunction -> 
  Function[{plot}, 
   Show[plot, AxesOrigin -> First /@ completePlotRange[plot], 
    DisplayFunction -> Identity]]]

值得注意的是,此代码提供的完全相同,只需指定Frame -> {{Automatic, None}, {Automatic, None}}, Axes -> False

即可
pl1 = Plot[Evaluate[Table[BesselJ[n, x], {n, 4}]], {x, 0, 10}, 
   Filling -> Axis, 
   DisplayFunction -> 
    Function[{plot}, 
     Show[plot, AxesOrigin -> First /@ completePlotRange[plot], 
      DisplayFunction -> Identity]]];
pl2 = Plot[Evaluate[Table[BesselJ[n, x], {n, 4}]], {x, 0, 10}, 
   Filling -> Axis, Frame -> {{Automatic, None}, {Automatic, None}}, 
   Axes -> False];
Rasterize[pl1] == Rasterize[pl1]

=> True