Вот (ИМО) более элегантный метод, основанный на коде Велисария, который использует опцию DisplayFunction
(см. здесь интересное обсуждение этой опции):
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
не всегда дает правильное значение PlotRange
.Решение состоит в том, чтобы использовать 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