superponer - agregue x=línea y a diagrama de dispersión
superponer graficas en r ggplot (3)
Estoy usando la función de diagrama de dispersión del paquete de auto para generar un diagrama de dispersión. Quiero ser capaz de generar una línea de referencia en la trama que debería ser x = y. Intenté usar abline y agrega una línea, pero no es la línea x = y. ¿Alguien puede ayudar?
Mi código es el siguiente:
scatterplot(phenos$P1~pheno$P0, data=pheno,spread=FALSE,ylab="6 month timepoint", xlab="Baseline Timepoint", jitter=list(x=1, y=1))
abline(0,1)
Gracias.
En realidad, esto es bastante difícil / hackeo, porque el scatterplot()
internamente scatterplot()
usa el layout
, lo que dificulta el control de la subtrama que está siendo utilizada actualmente por el controlador de gráficos. ( Actualización : es más difícil de lo que pensaba, el ajuste de par("mfg")
debe haber estado funcionando más o menos por accidente).
Inventario de datos ( actualización : el uso de datos con la media x e y no es igual a cero y no son iguales entre sí, ya que ilustra las dificultades de usar ingenuamente abline()
mayor claridad)
set.seed(1)
d <- data.frame(x=rnorm(10,mean=10),y=rnorm(10,mean=12))
library(car)
Prueba mi vieja estrategia (que en realidad no funciona, o funciona solo de forma impredecible):
scatterplot(y~x,data=d,reset.par=FALSE)
k <- 1
for (i in 1:2) {
for (j in 1:2) {
par(mfg=c(i,j,2,2))
abline(0,1,lwd=3,col=k)
k <- k+1
}
}
Dependiendo de cómo hago esto, o recibo advertencias y errores o respuestas falsas. Parece importar si hago el scatterplot()
llamada dentro de una función ... ??
Segundo intento, más conservador: reconstruir el diseño desde cero.
scatterplot(y~x,data=d)
uu <- par("usr")
## mimic layout frolm car:::scatterplot.default. Would be different if we were drawing only one
## of x-boxes or y-boxes
layout(matrix(c(1, 0, 3, 2), 2, 2), widths = c(5, 95),
heights = c(95, 5))
oldmar <- par(mar=rep(0,4)) ## zero out margins so we can plot in sub-boxes without errors
## now skip through the first two sub-plots
par(new=TRUE); plot.new(); par(new=TRUE); plot.new()
par(oldmar) ## reset margins
## blank plot with user limits set and ''interior'' axis calculations
plot(0:1,0:1,xlab="",ylab="",xlim=uu[1:2],ylim=uu[3:4],xaxs="i",yaxs="i")
## add annotation
abline(a=0,b=1,col=4,lwd=3)
Dada la cantidad de esfuerzo y la fragilidad de esta solución, podría ser mejor hackear el scatterplot
de scatterplot
para permitir opcionalmente que se especifique abline()
o pedirle al abline()
de esa capacidad ...
Puedes lograr tu objetivo con la misma función abline
. Utilice la función abline(a=0, b=1)
donde a
y b
son la intersección y la pendiente de la línea, respectivamente. Esto dibuja una línea recta de la forma Y = a + b*x
.
Espero que esto ayude.
Solo uso la función de segmentos: segmentos (x0 = 0, y0 = 0, x1 = 45, y1 = 45)
Simplemente haga que los valores y vayan justo por encima de los límites de su trama.
Esta función también es agradable porque no cambia los límites de xey de modo que la línea puede ejecutarse limpia en todo su gráfico sin tener que elegir con precisión los valores de xey.