Usuwanie granic na wykresach R w celu osiągnięcia osi Tufte

18

Rozważ następujący wykres:

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)

Jak mogę usunąć automatycznie generowane ramki i zachować tylko linie osi, aby uzyskać styl Tufte?

Hugo Sereno Ferreira
źródło
5
Spójrz na btyargument ?par, na przykład bty="n". Możesz przekazać ten argument w swoim wezwaniu do plot.
Glen_b
3
FWIW, Tufte poszedł dalej: pokazał, jak w niektórych przypadkach kasowanie części samych osi dostarcza dodatkowych informacji, skutecznie zamieniając każdą oś w wizualne wyświetlanie zakresu danych. Zainspirowany tym, w 1989 roku napisałem oprogramowanie do produkcji małych wielu fabuł, które zawierały ten projekt (między innymi inspirowane przez grupę Tufte i Billa Clevelanda), a następnie wygenerowały kilka milionów takich grafik. Kiedy musisz wydobywać tak dużo danych wizualnie, takie zasady naprawdę działają.
whuber
@ whuber Czy zamieniałeś osie na coś w rodzaju dywanu?
Silverfish
2
@Silver Rysowanie fabuły dywanów to osobny problem - ja też to zrobiłem. Jednak nawet w przypadku braku wykresu dywanu możesz wybrać, gdzie zatrzymać i rozpocząć rysowanie każdej osi. Kiedy uruchamiasz go na minimum i zatrzymujesz na maksimum, uzyskałeś wizualną reprezentację pełnego zakresu każdej krańcowej dystrybucji danych.
whuber
2
@whuber Dzięki, rozumiem teraz, o czym mówiłeś - Tufte nazywa to „ramką zakresu” (i sugeruje nie tylko zatrzymanie tam linii na skraju, ale także użycie końcowych etykiet do wskazania ich wartości - co on nazywa „ramkę zakresu z etykietami zakresu”). Późniejsi czytelnicy, którzy chcą odniesienia, pochodzą z wizualnego wyświetlania informacji ilościowych, rozdział 7 („Wielofunkcyjne elementy graficzne”). Ponieważ jest to wysoko oceniany wątek, fajnie byłoby zobaczyć dodaną ilustrację (i biorąc pod uwagę pytanie, trochę kodu R), co tak naprawdę może oznaczać „oś Tufte'a”.
Silverfish,

Odpowiedzi:

5

Jest to proste do zrobienia, wystarczy dołączyć argument axes=FALSE. Rozważać:

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)

wprowadź opis zdjęcia tutaj

Pamiętaj, że działa to równie dobrze w przypadku histogramów:

windows()
hist(y1, axes=F)

wprowadź opis zdjęcia tutaj

gung - Przywróć Monikę
źródło
4

Jeśli użyjesz

par(bty = 'n') 

Przed wywołaniem działki, która naprawi go w zoo. Może to również naprawić w różnych sytuacjach, w których nie można go przekazać do polecenia drukowania.

(Sprawdź opcję bty w pomocy par () dla innych rodzajów ramek dla wykresu)

Jan
źródło
0

Odpowiadam na bardziej ogólne pytanie dotyczące usuwania granic na wykresach, bez odniesienia do Tufte.

W przypadku histogramu nie znalazłem, że btn = 'n' pozbyło się granicy.

Rozwiązaniem, które działa dla histogramów i powinno działać dla wszystkich typów wykresów, jest ustawienie typu linii dla granicy na niewidoczny: lty = "blank"

PeterVermont
źródło