Принудительное выравнивание оси x по оси Y в графике Mathematica - PullRequest
5 голосов
/ 01 октября 2011

В Mathematica, когда я иногда рисую что-то, я не всегда получаю, чтобы ось х совпала с точным основанием графика.Есть ли способ, которым я могу заставить его делать это все время?

Вот пример того, о чем я говорю: http://i.imgur.com/3lcWd.png

Я хочу, чтобы ось х выровняласьидеально с нулевой отметкой внизу, а не посередине оси Y, как на этом изображении.

Как я могу это сделать?

Ответы [ 4 ]

9 голосов
/ 01 октября 2011

Используйте опцию AxesOrigin -> {0,0}

5 голосов
/ 01 октября 2011

Следующее будет рисовать ваши Оси слева и снизу, независимо от значений координат:

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

4 голосов
/ 01 октября 2011

Вы также можете использовать что-то вроде: Frame -> {{Automatic, None}, {Automatic, None}}

(Также я думаю, что тот факт, что он не выбирает {0,0} по умолчанию, означает, что y=0 вводится в диапазон на PlotRangePadding.это может быть еще один вариант, чтобы следить.)

1 голос
/ 01 октября 2011

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