studio - superponer graficas en r
¿Cómo puedo trazar con 2 ejes Y diferentes? (6)
Me gustaría superponer dos diagramas de dispersión en R para que cada conjunto de puntos tenga su propio eje y (diferente) (es decir, en las posiciones 2 y 4 en la figura) pero los puntos aparecen superpuestos en la misma figura.
¿Es posible hacer esto con la plot
?
Editar código de ejemplo que muestra el problema
# example code for SO question
y1 <- rnorm(10, 100, 20)
y2 <- rnorm(10, 1, 1)
x <- 1:10
# in this plot y2 is plotted on what is clearly an inappropriate scale
plot(y1 ~ x, ylim = c(-1, 150))
points(y2 ~ x, pch = 2)
Como su nombre lo sugiere, twoord.plot()
en el paquete plotrix traza con dos ejes de ordenadas.
library(plotrix)
example(twoord.plot)
Es una pregunta frecuente Aquí hay una solución más antigua que proporcioné hace casi seis años a la Galería R Graph
Podría ver, por ejemplo, en la función plotVolumeBars()
que combina una escala absoluta y una relativa en un gráfico.
Si puede renunciar a las etiquetas de escalas / ejes, puede cambiar la escala de los datos a intervalos (0, 1). Esto funciona, por ejemplo, para diferentes trakcs de "meneo" en los cromosomas, cuando generalmente te interesan las correlaciones locales entre las pistas y tienen diferentes escalas (cobertura en miles, Fst 0-1).
# rescale numeric vector into (0, 1) interval
# clip everything outside the range
rescale <- function(vec, lims=range(vec), clip=c(0, 1)) {
# find the coeficients of transforming linear equation
# that maps the lims range to (0, 1)
slope <- (1 - 0) / (lims[2] - lims[1])
intercept <- - slope * lims[1]
xformed <- slope * vec + intercept
# do the clipping
xformed[xformed < 0] <- clip[1]
xformed[xformed > 1] <- clip[2]
xformed
}
Luego, teniendo un marco de datos con chrom
, position
, coverage
y columnas de la primera columna, puede hacer algo como:
ggplot(d, aes(position)) +
geom_line(aes(y = rescale(fst))) +
geom_line(aes(y = rescale(coverage))) +
facet_wrap(~chrom)
La ventaja de esto es que no estás limitado a dos trakcs.
Una opción es hacer dos parcelas una al lado de la otra. ggplot2
proporciona una buena opción para esto con facet_wrap()
:
dat <- data.frame(x = c(rnorm(100), rnorm(100, 10, 2))
, y = c(rnorm(100), rlnorm(100, 9, 2))
, index = rep(1:2, each = 100)
)
require(ggplot2)
ggplot(dat, aes(x,y)) +
geom_point() +
facet_wrap(~ index, scales = "free_y")
Yo también twoord.stackplot()
en el paquete plotrix
traza con más de dos ejes de ordenadas.
data<-read.table(text=
"e0AL fxAL e0CO fxCO e0BR fxBR anos
51.8 5.9 50.6 6.8 51.0 6.2 1955
54.7 5.9 55.2 6.8 53.5 6.2 1960
57.1 6.0 57.9 6.8 55.9 6.2 1965
59.1 5.6 60.1 6.2 57.9 5.4 1970
61.2 5.1 61.8 5.0 59.8 4.7 1975
63.4 4.5 64.0 4.3 61.8 4.3 1980
65.4 3.9 66.9 3.7 63.5 3.8 1985
67.3 3.4 68.0 3.2 65.5 3.1 1990
69.1 3.0 68.7 3.0 67.5 2.6 1995
70.9 2.8 70.3 2.8 69.5 2.5 2000
72.4 2.5 71.7 2.6 71.1 2.3 2005
73.3 2.3 72.9 2.5 72.1 1.9 2010
74.3 2.2 73.8 2.4 73.2 1.8 2015
75.2 2.0 74.6 2.3 74.2 1.7 2020
76.0 2.0 75.4 2.2 75.2 1.6 2025
76.8 1.9 76.2 2.1 76.1 1.6 2030
77.6 1.9 76.9 2.1 77.1 1.6 2035
78.4 1.9 77.6 2.0 77.9 1.7 2040
79.1 1.8 78.3 1.9 78.7 1.7 2045
79.8 1.8 79.0 1.9 79.5 1.7 2050
80.5 1.8 79.7 1.9 80.3 1.7 2055
81.1 1.8 80.3 1.8 80.9 1.8 2060
81.7 1.8 80.9 1.8 81.6 1.8 2065
82.3 1.8 81.4 1.8 82.2 1.8 2070
82.8 1.8 82.0 1.7 82.8 1.8 2075
83.3 1.8 82.5 1.7 83.4 1.9 2080
83.8 1.8 83.0 1.7 83.9 1.9 2085
84.3 1.9 83.5 1.8 84.4 1.9 2090
84.7 1.9 83.9 1.8 84.9 1.9 2095
85.1 1.9 84.3 1.8 85.4 1.9 2100", header=T)
require(plotrix)
twoord.stackplot(lx=data$anos, rx=data$anos,
ldata=cbind(data$e0AL, data$e0BR, data$e0CO),
rdata=cbind(data$fxAL, data$fxBR, data$fxCO),
lcol=c("black","red", "blue"),
rcol=c("black","red", "blue"),
ltype=c("l","o","b"),
rtype=c("l","o","b"),
lylab="Años de Vida", rylab="Hijos x Mujer",
xlab="Tiempo",
main="Mortalidad/Fecundidad:1950–2100",
border="grey80")
legend("bottomright", c(paste("Proy:",
c("A. Latina", "Brasil", "Colombia"))), cex=1,
col=c("black","red", "blue"), lwd=2, bty="n",
lty=c(1,1,2), pch=c(NA,1,1) )
actualización : material copiado que estaba en la R wiki en http://rwiki.sciviews.org/doku.php?id=tips:graphics-base:2yaxes : 2yaxes , enlace ahora roto: también disponible en la máquina de retorno
Dos ejes y diferentes en la misma parcela
(algún material originalmente por Daniel Rajdl 2006/03/31 15:26)
Tenga en cuenta que hay muy pocas situaciones en las que sea apropiado usar dos escalas diferentes en la misma parcela. Es muy fácil confundir al espectador del gráfico. Verifique los siguientes dos ejemplos y comentarios sobre este tema ( example1 , example2 de Junk Charts ), así como este artículo de Stephen Few (que concluye "Ciertamente no puedo concluir, de una vez por todas, que los gráficos con ejes de doble escala nunca útil, solo que no puedo pensar en una situación que lo justifique a la luz de otras soluciones mejores ".) También vea el punto # 4 en esta caricatura ...
Si está decidido, la receta básica es crear su primer gráfico, establezca par(new=TRUE)
para evitar que R limpie el dispositivo gráfico, creando el segundo gráfico con axes=FALSE
(y estableciendo xlab
y ylab
para estar en blanco - ann=FALSE
también debería funcionar) y luego usar axis(side=4)
para agregar un nuevo eje en el lado derecho, y mtext(...,side=4)
para agregar una etiqueta de eje en el lado derecho. Aquí hay un ejemplo usando un poco de datos inventados:
set.seed(101)
x <- 1:10
y <- rnorm(10)
## second data set on a very different scale
z <- runif(10, min=1000, max=10000)
par(mar = c(5, 4, 4, 4) + 0.3) # Leave space for z axis
plot(x, y) # first plot
par(new = TRUE)
plot(x, z, type = "l", axes = FALSE, bty = "n", xlab = "", ylab = "")
axis(side=4, at = pretty(range(z)))
mtext("z", side=4, line=3)
twoord.plot()
en el paquete plotrix
automatiza este proceso, al igual que doubleYScale()
en el paquete latticeExtra
.
Otro ejemplo (adaptado de una publicación de la lista de correo de R por Robert W. Baer):
## set up some fake test data
time <- seq(0,72,12)
betagal.abs <- c(0.05,0.18,0.25,0.31,0.32,0.34,0.35)
cell.density <- c(0,1000,2000,3000,4000,5000,6000)
## add extra space to right margin of plot within frame
par(mar=c(5, 4, 4, 6) + 0.1)
## Plot first set of data and draw its axis
plot(time, betagal.abs, pch=16, axes=FALSE, ylim=c(0,1), xlab="", ylab="",
type="b",col="black", main="Mike''s test data")
axis(2, ylim=c(0,1),col="black",las=1) ## las=1 makes horizontal labels
mtext("Beta Gal Absorbance",side=2,line=2.5)
box()
## Allow a second plot on the same graph
par(new=TRUE)
## Plot the second plot and put axis scale on right
plot(time, cell.density, pch=15, xlab="", ylab="", ylim=c(0,7000),
axes=FALSE, type="b", col="red")
## a little farther out (line=4) to make room for labels
mtext("Cell Density",side=4,col="red",line=4)
axis(4, ylim=c(0,7000), col="red",col.axis="red",las=1)
## Draw the time axis
axis(1,pretty(range(time),10))
mtext("Time (Hours)",side=1,col="black",line=2.5)
## Add Legend
legend("topleft",legend=c("Beta Gal","Cell Density"),
text.col=c("black","red"),pch=c(16,15),col=c("black","red"))
Se pueden usar recetas similares para superponer gráficas de diferentes tipos: gráficos de barra, histogramas, etc.