2012-06-19 16 views
7

Mam trochę kodu ggplot, który działał poprawnie w 0.8.9, ale nie w 0.9.1.geom_vline z Character xintercept

mam zamiar wykreślić dane w theDF i chciałby wykreślić linię pionową w xintercept="2010 Q1."theGrid jest jedynie wykorzystywane do tworzenia theDF.

theGrid <- expand.grid(2009:2011, 1:4) 
theDF <- data.frame(YrQtr=sprintf("%s Q%s", theGrid$Var1, theGrid$Var2), 
        Minutes=c(1000, 2200, 1450, 1825, 1970, 1770, 1640, 1920, 1790, 1800, 1750, 1600)) 

Kod stosuje się:

g <- ggplot(theDF, aes(x=YrQtr, y=Minutes)) + 
     geom_point() + 
     opts(axis.text.x=theme_text(angle=90)) 

g + geom_vline(data=data.frame(Vert="2010 Q2"), aes(xintercept=Vert)) 

Ponownie, działa dobrze w R 2.13.2 z ggplot2 0.8.9, ale nie w R 2.14+ z ggplot2 0.9.1.

Rozwiązaniem jest:

g + geom_vline(data=data.frame(Vert=4), aes(xintercept=Vert)) 

Ale to nie jest to dobre rozwiązanie dla mojego problemu.

Może pomóc w rozmowie z scale_x_discrete?

+0

Nie można tego powtórzyć bez 'theVerts' (co, jak przypuszczam, jest ramką danych?). – joran

+0

@joran Miałem 'data =' w 'aes 'przez przypadek. Zostało to naprawione, a Verts został zastąpiony przez 'data.frame (Vert =" 2010 Q2 ")'. – Jared

+0

To wygląda jak błąd. Czy możesz zgłosić problem na stronie: https://github.com/hadley/ggplot2/issues – wch

Odpowiedz

0

Gdy używasz wektora znaku lub współczynnika dla osi X w wykresie, wartości domyślne nadawane każdemu z unikatowych elementów to po prostu liczba całkowita zaczynająca się od 1. Tak więc, jeśli twoje poziomy to c ("A "" B "," C "), wówczas lokalizacje osi X to c (1,2,3). Nie ma czegoś takiego jak lokalizacja postaci, tylko etykieta postaci. Jeśli chcesz linię pionową w punkcie A, ustaw ją na 1. Jeśli chcesz ją w połowie między A i B, ustaw ją na 1,5. Ponownie, są to wartości domyślne. Jeśli konkretna fabuła zrobiła coś innego, łatwo możesz to zrobić, umieszczając linie w kilku lokalizacjach i sprawdzając, co się dzieje.

+0

Tak, tak jest w przypadku. Ale w starej wersji 'ggplot2', jeśli nakarmiłeś ją" A ", przełożyłoby to na 1 i umieściło wiersz poprawnie. To zachowanie jest pożądane, ponieważ użytkownik będzie znał oryginalną skalę, niekoniecznie to, do czego tłumaczy. Mam nadzieję odtworzyć zachowanie 'ggplot2' używane do eksponowania. – Jared

12

Można spróbować to:

g + geom_vline(aes(xintercept = which(levels(YrQtr) %in% '2010 Q1'))) 

Eliminuje to potrzebę stworzenia atrapę ramkę danych dla wybranego poziomu czynnika. Komenda which() zwraca indeks (lub indeksy, jeśli prawa strona operatora% w% jest wektorem) poziomu współczynnika [s], aby powiązać go z vlines.

Jedna uwaga jest taka, że ​​jeśli niektóre kategorie nie pojawiają się w danych i używasz drop = TRUE w skali, linie nie będą wyświetlane we właściwym miejscu.

+0

Interesujące podejście. Sprawdzę, aby upewnić się, że można to uogólnić na inne typy danych. – Jared

Powiązane problemy