superponer - Inconsistencia R: ¿por qué add=T a veces funciona y otras veces no en la función plot()?
superponer graficas en r (2)
Esto es ciertamente molesto e inconsistente, pero es explicable.
editar : el hecho de que la identity
es un objeto incorporado (función de identidad) me eludió (por lo que el problema es de hecho reproducible).
identity
es un objeto de una clase - function
- que tiene un método de plot
( plot.function
) con un argumento add
, mientras que el método de plot
predeterminado no tiene un argumento add
.
En general, cuando trates de trazar la bar
objetos, deberías probar la class(bar)
; si es de clase foo
, prueba con methods(class="foo")
para ver si tiene un método de trazado, o methods("plot")
para ver que plot.foo
existe. Pruebe ?plot.foo
para ver la ayuda, o plot.foo
o getAnywhere(plot.foo)
para ver la función en sí.
¿Por qué R es inconsistente con el parámetro add
en la función plot()
? ¡A veces funciona y a veces no funciona! En este ejemplo, toma el parámetro add=TRUE
sin problema:
plot(0:10, 0:10*3)
plot(identity, add=TRUE, xlim=c(0,10))
plot(function (x) { sin(x)*10 }, add=TRUE, xlim=c(0,10))
Pero cuando publico
plot(c(2, 3, 4), c(20,10,15), add=TRUE, pch="A")
¡No funciona! Dice que "agregar" no es un parámetro gráfico.
Por favor, no escriba que debería usar points()
lugar. Sé que puedo usarlo. Quiero entender el comportamiento extraño de R: ¿por qué a veces funciona y otras no?
Esto se debe a que cuando llamas a plot(0:10, 0:10*3)
o plot(c(2, 3, 4), c(20,10,15))
, estás llamando indirectamente a plot.default()
, que a su vez llama a plot.xy()
, mientras que las otras dos llamadas que menciona están ejecutando plot.function()
. add
es un argumento para plot.function()
, pero no para plot.xy()
.
Puede solucionar esta incoherencia configurando par(new = TRUE)
, pero luego debe asegurarse de no agregar nuevas etiquetas de eje o redibujar los ejes. EDITAR: Como se señala en el comentario, debe asegurarse de que el rango sea el mismo que el del gráfico anterior. p.ej:
plot(0:10, 0:10*3)
plot(identity, add=T, xlim=c(0,10))
plot(function (x) { sin(x)*10 }, add=T, xlim=c(0,10))
par(new = TRUE)
plot(c(2, 3, 4), c(20,10,15), pch="A",
axes = FALSE, ## don''t redraw the axes
xlab = '''', ylab = '''', ## no fresh axis labels
xlim = c(0,10), ylim = c(0,30)) ## keep the same limits as before
Como Ben Bolker menciona, los methods(''plot'')
le mostrarán qué métodos se pueden invocar cuando se ejecuta plot()
: los diferentes métodos tienen argumentos diferentes, que se enumeran cuando se llama a args(plot.foo)
o en la página de ayuda ?plot.foo