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?


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


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)


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"

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.