Eliminar bordes en las parcelas R para lograr el eje de Tufte

18

Considere el siguiente gráfico:

x <- 1:100
y1 <- rnorm(100)
y2 <- rnorm(100)+100

par(mar=c(5,5,5,5))

plot(x,y1,pch=0,type="b",col="red",yaxt="n",ylim=c(-8,2),ylab="")
axis(side=2, at=c(-2,0,2))
mtext("red line", side = 2, line=2.5, at=0)

par(new=T)
plot(x,y2,pch=1,type="b",col="blue",yaxt="n",ylim=c(98,108), ylab="")
axis(side=4, at=c(98,100,102), labels=c("98%","100%","102%"))
mtext("blue line", side=4, line=2.5, at=100)

¿Cómo puedo eliminar los bordes generados automáticamente y preservar solo las líneas del eje, para lograr el estilo de Tufte?

Hugo Sereno Ferreira
fuente
55
Mire el btyargumento en ?par, por ejemplo bty="n",. Puede pasar este argumento en su llamada a plot.
Glen_b -Reinstala a Monica
3
FWIW, Tufte fue más allá: mostró cómo, en algunos casos, borrar partes de los propios ejes proporciona información adicional, convirtiendo cada eje en una visualización visual del rango de datos. Inspirado por esto, en 1989 escribí un software para producir pequeñas tramas múltiples que incorporaron este diseño (entre muchos otros inspirados por el grupo de Tufte y Bill Cleveland) y posteriormente generaron varios millones de gráficos. Cuando tiene que extraer tantos datos visualmente, tales principios realmente funcionan.
whuber
@whuber Efectivamente, ¿estabas reemplazando los ejes por una especie de parcela de alfombra?
Silverfish
2
@Silver Dibujar un diagrama de alfombra es un tema aparte, y también lo hice yo también. Sin embargo, incluso en ausencia de un diagrama de alfombra, puede elegir dónde detenerse y comenzar a dibujar cada eje. Cuando lo inicia al mínimo y lo detiene al máximo, ha logrado una representación visual del rango completo de cada distribución marginal de datos.
whuber
2
@whuber Gracias, ahora entiendo a qué te referías: Tufte llama a esto un "marco de rango" (y sugiere no solo detener las líneas allí en los extremos, sino también usar las etiquetas finales para indicar sus valores). llama al "marco de rango con etiquetas de rango"). Para lectores posteriores que deseen una referencia, esto es de Visual Display of Quantitative Information, Capítulo 7 ("Elementos gráficos multifuncionales"). Como este es un hilo muy visto, sería bueno ver una ilustración agregada (y dada la pregunta, un código R) de lo que realmente podría significar el "eje de Tufte".
Silverfish

Respuestas:

5

Esto es sencillo de hacer, solo incluye el argumento axes=FALSE. Considerar:

x  <- 1:100
y1 <- rnorm(100)
y2 <- rnorm(100) + 100

windows()
  par(mar=c(5,5,5,5))
  plot(x, y1, pch=0, type="b", col="red", yaxt="n", ylim=c(-8,2), ylab="", axes=F)
  axis(side=2, at=c(-2,0,2))
  mtext("red line", side = 2, line=2.5, at=0)

  par(new=T)
  plot(x, y2, pch=1, type="b", col="blue", yaxt="n", ylim=c(98,108), ylab="", axes=F)
  axis(side=4, at=c(98,100,102), labels=c("98%","100%","102%"))
  mtext("blue line", side=4, line=2.5, at=100)

ingrese la descripción de la imagen aquí

Tenga en cuenta que esto funciona igualmente bien para histogramas:

windows()
hist(y1, axes=F)

ingrese la descripción de la imagen aquí

gung - Restablece a Monica
fuente
4

Si utiliza

par(bty = 'n') 

Antes de llamar a la trama que lo arreglará para el zoológico. También podría solucionarlo para una variedad de situaciones en las que no es aceptable para el comando de trazado.

(Consulte la opción bty en la ayuda par () para otros tipos de marcos para la trama)

John
fuente
0

Estoy respondiendo la pregunta más general de eliminar bordes en parcelas, sin referencia a Tufte.

Para un histograma no encontré que btn = 'n' se haya deshecho del borde.

Una solución que funciona para los histogramas y debería funcionar para todos los tipos de gráficos es establecer el tipo de línea para el borde en invisible: lty = "blank"

PeterVermont
fuente