2012-12-04 13 views
19

Jak możemy powielić ukryte linie poziome Tufte w R?R Wykresy: Tworzenie poziomych linii kreskowych Tufte

Tufte bars

Na przykład poniższe nie jest to dobry punkt wyjścia:

library(ggplot2)  
ggplot(msleep, aes(x=order)) + stat_bin() + theme_bw() 

Demontaż linii granicznej powinny być proste. Punkt krytyczny, nakładający się na poziomą linię z prętami, jest dla mnie niejasny.

wyobrażam sobie dwa podejścia tutaj:

  1. Ad-hoc rozwiązanie dla tego konkretnego przykładu
  2. Sugestia jak włączyć go do motywu
+0

Myślę, że to pytanie jest o wiele lepiej sformułowane, więc głosować na n ot zamknięcie. – Andrie

+0

Myślę, że głównym problemem jest to, że tytuł jest dokładnie taki sam jak proponowany duplikat. Proponuję, aby różnica, tj. (Dokładny przypadek), mogła być oddestylowana do postaci możliwej do odtworzenia w tytule. Jeśli są wystarczająco różne, tytuł każdego z nich powinien odzwierciedlać specyfikę. – krock

+0

@Andrie, Tak, zgadzam się z tobą, ale myślę, że mod został ponownie otwarty, więc jest to kwestia sporna. Moim celem było raczej połączenie dwóch postów, więc pójdę tam i powiążę link tutaj. kroch ma rację, że tytuł jest problemem. Dodanie "w ggplot2" na końcu rozróżniłoby te dwa jeszcze bardziej. –

Odpowiedz

11

Nie jest to duży dodatek do @Andrie odpowiedź, ale można wziąć przewagę pakietu ggthemes aby Tufte-sque działek z ggplot2. Poniżej Używam theme_tufte, zmienić czcionkę za pomocą extrafont pakiet i korzystać opts aby dostroić wszystkie inne cechy wizualne:

library(ggthemes) 
library(extrafont) 
ggplot(msleep, aes(x=order)) + stat_bin(width=0.6, fill="gray") + 
    theme_tufte(base_family="GillSans", base_size=16, ticks=F) + 
    theme(axis.line=element_blank(), axis.text.x=element_blank(), 
     axis.title=element_blank()) + 
    geom_hline(yintercept=seq(5, 20, 5), col="white", lwd=1.2) 

enter image description here

18

W zasadzie jest to proste - wszystko co trzeba zrobić, to narysować białe poziome linie w nowej warstwie. Można użyć geom_hline to zrobić:

library(ggplot2)  
ggplot(msleep, aes(x=order)) + stat_bin() + theme_bw() + 
    geom_hline(yintercept=seq(5, 20, 5), col="white") 

enter image description here

Co do drugiego pytania - Wyobrażam sobie, może to być trudne, aby włączyć do tematu, chociaż powinno być możliwe stworzenie własnego geom który odczytuje podziałkę w skali Y i odpowiednio wykreśla linie.

(chciałbym być okazały się błędne.)

+0

Miło, zakładam, że wyodrębnianie wartości seq automatycznie jest trudne ? – Rico

+0

@Rico: powinno być łatwo. 'horiz_lines' <- seq (y_min, y_max, by = 5)', gdzie "wstępnie wyliczyłem" wartości maksymalne i minimalne. Następnie 'yintercept = c (horiz_lines)' i gotowe. –

3

Jest też całkiem proste rozwiązanie baza R dla tego :

tmp <- table(msleep$order) 
barplot(tmp, col='black', las=3) 
abline(h=seq(5, max(tmp), by=5), col='white', lwd=2) 

enter image description here

+0

Eleganckie rozwiązanie! – Rico

+0

Z 'segmentami (0, 1: 4 * 5, 100, 1: 4 * 5, col = 'biały')' zamiast 'lapply (... abline (...)) 'line to wydarzenie bardziej eleganckie. – Backlin

+0

@Backlin Dzięki za sugestię, ponieważ przypomniało mi to, że 'abline' również jest wektoryzowany. – Thomas