2012-07-13 30 views
5

Próbuję wykreślić wiele linii w ramach jednego „klasa” w ggplot2. mogę wykreślić coś jak następuje:ggplot: wielu linii dla jednego koloru/klasy

image with 5 classes

Ale mój problem jest, że chcę, aby pokazać, N1, N2 i N3, jednej klasy (szare cienkie linie dla każdego z jednej nazwy w legendzie) .

Moim problemem jest to, że jeśli utworzę nowy czynnik w ramce danych, aby je zgrupować, to kończę rysowanie połączenia dodawania od końca n1 (prawy górny róg) do początku n2 (dolny lewy), który dodaje przekątnej w poprzek mojego wykresu:

graph with one class

to bliżej do tego, co chcę, ale ma dodatkową linię ukośną. Jeśli jest to ważne, ja obliczeniowych są pomocą ROCR następnie ekstrakcji x i punkty y z końcowego performance przedmiotu w celu wytworzenia w tym kierunku.

+1

Będzie to o wiele łatwiejsze rozwiązanie, jeśli podasz minimalny odtwarzalny przykład (dane + kod). – joran

+0

Zgadzam się. Niestety, bałem się, że kod wymagany do odtworzenia takiego przykładu zajmie więcej miejsca niż faktyczne pytanie. Mam nadzieję, że ktoś może rozpoznać teorię i już wcześniej widział rozwiązanie tego problemu. –

+1

Nie rozumiem pytań bez powtarzalnych przykładów, ale wydaje mi się, że na drugim wykresie można użyć tej samej zmiennej, co na pierwszym wykresie, aby określić estetykę "grupową" i nowy czynnik dla koloru. – baptiste

Odpowiedz

1

Oto jeden ze sposobów, ale nie sądzę, że ci się podoba bardzo dużo:

d1 <- data.frame(x = 1:10, 
       y = rep(1:2,each = 5), 
       grp = factor(rep(letters[1:2],each = 5),levels = letters[1:3])) 
d1 <- rbind(d1,data.frame(x = 1:2,y = c(NA,NA),grp = c('c','c'))) 

d2 <- data.frame(x = 1:15, 
       y = rep(3:5,each = 5), 
       grp = rep(1:3,each = 5)) 

ggplot() + 
    geom_line(data = d1,aes(x = x,y = y,group = grp,colour = grp)) + 
    geom_line(data = d2,aes(x = x,y = y,group = grp),colour = "blue") 

enter image description here

pamiętać, że rozwiązanie to nie będzie dobrze współpracować z innymi rodzajami danych. To po prostu zdarza się, że każda z trzech linii, które chcą połączyć się z tej samej kategorii w legendzie zaczynają się i kończą w zasadzie w tym samym miejscu. Gdyby tak nie było, skończyłoby się niechcianymi liniami łączącymi.

Powyższa metoda będzie działać bardziej ogólnie, ale jak widać nie jest mniej kłopotliwe. Jeśli cokolwiek jest bardziej niewygodne.

Ten rodzaj problemu pojawił się wiele razy i może się zdarzyć, że zapominam o prostszym rozwiązaniu.Ale ogólnie rzecz biorąc, staraj się pamiętać, że w zamian za ggplot2 nie musisz konstruować każdej legendy ręcznie, (często, ale nie zawsze) rezygnujesz z pewnej elastyczności w porównaniu z podstawową grafiką.

+0

Dzięki! Byłbym pierwszym, który wyznał, że moje rozwiązanie nie powinno być powszechnie przyjęte. To dobre rozwiązanie - nauczyłem mesomething new o warstwach w ggplot2 - ale zgadzam się, że jest to mniej niż idealne. Myślę, że prawdopodobnie lepiej mi będzie z 'liniami' w tym scenariuszu, ale już sformatowałem resztę grafiki za pomocą ggplot2, więc zamierzam zachować spójność w stosunku do wygody w tym momencie. Dzięki jeszcze raz. –

0

Miałem rbind "d obiektów z obiektu ROCR performance do data.frame bezpośrednio podczas próby wykreślenia tego wykresu. Zdaję sobie sprawę, że mogłem przeciąć podróż z góry na prawo na lewą dolną, odwracając kolejność klasy średniej danych. tj

n1 <- getPerformance(test1) 
n2 <- getPerformance(test2) 
n3 <- getPerformance(test3) 

by stworzyć trzy dane ramek patrząc jak

type x   y 
1 n1 0 0.000000000 
2 n1 0 0.003448276 
3 n1 0 0.006896552 
4 n1 0 0.010344828 
5 n1 0 0.013793103 
6 n1 0 0.017241379 
... 
26565 n1 0.9999619 1 
26566 n1 1.0000000 1 

Problem polega na tym, że kiedy rbind N1 do N2, będę się łączył N1 męska punktu (1,1) do punktu N2 za (0,0) - tworzenie linii ukośnej.

W moim przypadku, jedno rozwiązanie (niechlujny) było po prostu odwrócić kolejność każdej innej linii, tak że nie było przekątna linia.

n2_rev <- n2[nrow(n2):1,] 
ns <- rbind(n1,n2_rev,n3) 

Więc teraz linia wraca i z powrotem zamiast początkowego i końcowego w tej samej pozycji konsekwentnie, tworząc następujące wykresu:

desired graph

Niemniej zakładam jest bardziej uniwersalny sposób na poradzenie sobie z tym. Czy jest to dobry sposób, aby dodać linię na wykresie ggplot2 takie jak funkcja lines() dla bazowego R?

Powiązane problemy