2011-09-30 23 views
5

En Mathematica, cuando trazo cosas a veces no siempre consigo que el eje x se alinee con la parte inferior exacta de la gráfica. ¿Hay alguna manera de obligarlo a hacer esto todo el tiempo?Obligando al eje x a alinearse con el eje y en Mathematica Plot

He aquí un ejemplo de lo que estoy hablando: http://i.imgur.com/3lcWd.png

Quiero que el eje x alinearse perfectamente con la forma marca cero garrapata en la parte inferior, no en el medio del eje y como se está en esa imagen.

¿De qué manera puedo lograr esto?

+0

Creo que ayudaría si pudieras agregar la instrucción matemática que produjo esa gráfica/imagen a tu pregunta? – dbjohn

Respuesta

4

También podría utilizar algo como: Frame -> {{Automatic, None}, {Automatic, None}}

(También creo que el hecho de que no es la elección de {0,0} por defecto significa que y=0 está siendo llevado a rango de PlotRangePadding Así que eso. puede ser otra opción a tener en cuenta.)

5

Lo siguiente dibujará sus Ejes a la izquierda y abajo, independientemente de los valores de las coordenadas:

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

+0

+1 ¡Práctico! ----- – Simon

+0

@belisarius: Me gusta su solución y la solución derivada de Alexey Popkov por su generalidad, pero quiero mantenerme alejado de ellos simplemente porque es mucho más complicado y la alineación que tengo que hacer se satisface fácilmente por 'AxesOrigin -> {0, 0} '. Es una lástima que algo como esto ya no esté integrado en Mathematica. –

+0

@Mike Si todo lo que necesitas es el {0,0} caso, obviamente, ¡AxesOrigin es el camino a seguir! –

1

Aquí está el método (OMI) más elegante basado en el código de Belisario, que utiliza la opción DisplayFunction (ver here interesante discusión sobre esta opción):

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]]] 

El único inconveniente de ambos métodos es que AbsoluteOptions does not always give correct value of PlotRange. La solución es utilizar the Ticks hack (que da la completa PlotRange con valor explícito de PlotRangePadding añadido):

completePlotRange[plot_] := 
[email protected]@ 
    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]]] 

Es interesante señalar que este código da exactamente la misma representación como simplemente especificando 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 
+0

Conocía la anomalía de PlotRange, pero pensé que estaba relacionada con algunos primos Plot [], pero no con Plot []. –

Cuestiones relacionadas