Remoção de bordas nos gráficos R para alcançar o eixo do Tufte

18

Considere o seguinte 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)

Como posso remover as bordas geradas automaticamente e preservar apenas as linhas do eixo, para obter o estilo de um Tufte?

Hugo Sereno Ferreira
fonte
5
Veja o btyargumento em ?par, por exemplo bty="n",. Você pode passar esse argumento na sua chamada para plot.
Glen_b -Reinstate Monica
3
FWIW, Tufte foi mais longe: ele mostrou como, em alguns casos, o apagamento de partes dos próprios eixos fornece informações adicionais, transformando efetivamente cada eixo em uma exibição visual do intervalo de dados. Inspirado por isso, em 1989, escrevi um software para produzir pequenos lotes múltiplos que incorporavam esse design (entre muitos outros inspirados pelo grupo de Tufte e Bill Cleveland) e, posteriormente, geramos vários milhões desses gráficos. Quando você precisa extrair tantos dados visualmente, esses princípios realmente funcionam.
whuber
@whuber Efetivamente, você estava substituindo os eixos por uma espécie de enredo de tapete?
Silverfish
2
@Silver Desenhar uma trama de tapete é uma questão separada - e eu também fiz isso também. No entanto, mesmo na ausência de um gráfico de tapete, você pode escolher onde parar e começar a desenhar cada eixo. Quando você inicia no mínimo e para no máximo, você consegue uma representação visual de todo o intervalo de cada distribuição marginal de dados.
whuber
2
@whuber Obrigado, agora eu entendo o que você estava se referindo - o Tufte chama isso de "quadro de intervalo" (e sugere não apenas parar as linhas lá nos extremos, mas também usar os rótulos finais para indicar seus valores - o que ele chama o "quadro de intervalo com rótulos de intervalo"). Para leitores posteriores que desejam uma referência, isso é do Visual Display of Quantitative Information, capítulo 7 ("Multifunctioning Graphical Elements"). Como este é um tópico altamente visualizado, seria bom ver uma ilustração adicionada (e dada a pergunta, algum código R) do que "eixo do Tufte" pode realmente significar.
Silverfish

Respostas:

5

Isso é simples de fazer, basta incluir o 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)

insira a descrição da imagem aqui

Observe que isso funciona igualmente bem para histogramas:

windows()
hist(y1, axes=F)

insira a descrição da imagem aqui

- Reinstate Monica
fonte
4

Se você usar

par(bty = 'n') 

Antes de chamar o enredo que o consertará no zoológico. Também pode corrigi-lo para uma variedade de situações em que não é passável para o comando de plotagem.

(Confira a opção bty na ajuda do par () para outros tipos de quadros para o gráfico)

John
fonte
0

Estou respondendo à questão mais geral de remover bordas em parcelas, sem referência ao Tufte.

Para um histograma, não achei que btn = 'n' se livrou da borda.

Uma solução que funciona para histogramas e deve funcionar para todos os tipos de plotagens é definir o tipo de linha da borda como invisível: lty = "blank"

PeterVermont
fonte