2011-06-29 8 views
8

Załóżmy, że mam następujące ramki danych:wiele linii każdorazowo w innym dataframe w ggplot2 - automatyczne kolorowanie i legenda

df1 = data.frame(c11 = c(1:5), c12 = c(1:5)) 
df2 = data.frame(c21 = c(1:5), c22 = (c(1:5))^0.5) 
df3 = data.frame(c31 = c(1:5), c32 = (c(1:5))^2) 

Chcę wykreślić je jako linie w tym samym Działka/panelu. Mogę to zrobić przez:

p <- ggplot() + geom_line(data=df1, aes(x=c11, y = c12)) + 
    geom_line(data=df2, aes(x=c21,y=c22)) + 
    geom_line(data=df3, aes(x=c31, c32)) 

Wszystkie te elementy będą czarne. Jeśli chcę je w innym kolorze, mogę określić kolor jawnie jako argument dla geom_line(). Moje pytanie brzmi: czy mogę określić listę kilku kolorów, powiedzmy 5 kolorów, takich jak czerwony, niebieski, zielony, pomarańczowy, szary, i użyć tej listy, aby nie trzeba było jawnie określać kolorów jako argumentu dla geom_line() w przypadku każdej linii. Jeśli na wykresie p znajdują się 2 instrukcje geom_line(), to zostaną one odpowiednio oznaczone kolorem czerwonym i niebieskim. Jeśli zawiera 3 instrukcje geom_line, będzie je kolorem czerwonym, niebieskim i zielonym. Na koniec, jak mogę określić legendę dla tych wykresów. Nawet jeśli mogę podać kolory jako wektor pod koniec p, byłoby świetnie. Proszę dać mi znać, jeśli pytanie nie jest jasne.

Dzięki.

Odpowiedz

12

ggplot2 działa najlepiej, jeśli pracujesz z roztopionym data.frame który zawiera inną kolumnę, aby określić różne estetyki. Topienie jest łatwiejsze dzięki zwykłym nazwom kolumn, więc zacznę od tego. Oto kroki zabrałbym:

  • zmienić nazwę kolumny
  • stopić dane, które dodaje nowe zmienne, które będziemy mapę do estetyki koloru
  • definiować kolor wektor
  • Określić odpowiednią skalę z scale_colour_manual

'

names(df1) <- c("x", "y") 
names(df2) <- c("x", "y") 
names(df3) <- c("x", "y") 

newData <- melt(list(df1 = df1, df2 = df2, df3 = df3), id.vars = "x") 

#Specify your colour vector 
cols <- c("red", "blue", "green", "orange", "gray") 

#Plot data and specify the manual scale 
ggplot(newData, aes(x, value, colour = L1)) + 
    geom_line() + 
    scale_colour_manual(values = cols) 

Zmieniano dla jasności

Struktura newData:

'data.frame': 15 obs. of 4 variables: 
$ x  : int 1 2 3 4 5 1 2 3 4 5 ... 
$ variable: Factor w/ 1 level "y": 1 1 1 1 1 1 1 1 1 1 ... 
$ value : num 1 2 3 4 5 ... 
$ L1  : chr "df1" "df1" "df1" "df1" ... 

i samej działki:

enter image description here

+1

+1 Czystsze wersją moją odpowiedź ... – joran

+0

@Chase. Dzięki! Jednak podany przez ciebie przykład kreśli pojedynczą linię, a nie trzy różne linie. Przypuszczam, że mogę zająć się tym, dodając 'group = L1' jako argument do' aes() '. Problem z tą legendą. Czy możesz spróbować? Legenda nie ma sensu. Legenda zawiera więcej niż trzy klucze. – Curious2learn

+0

@Curious - Jaka jest struktura twoich prawdziwych danych? Uruchomienie powyższego kodu daje trzy linijki z legendą, która wydaje mi się intuicyjna ... Zaktualizuję swoją odpowiedź słowem "newData" i przedstawię fabułę, którą widzę. Nie wiesz, dlaczego otrzymujesz coś innego, chyba że Twoje dane nie są reprezentatywne dla przykładowych danych. W razie potrzeby możesz wymusić L1, choć nie powinno to stanowić problemu. – Chase

4

Tego typu pytania stają się znacznie łatwiejsze do rozwiązania, jeśli dostosujesz swoje myślenie do sposobu, w jaki podchodzi grafika do tego, co jest ggplot2. ggplot2 jest zorganizowany wokół idei, że wszystko, co pojawi się na wykresie, powinno (w zasadzie) istnieć jako kolumna w ramce danych. (Są oczywiście wyjątki, ale to jest ogólny pomysł.)

Twoja próba zbudowania tego wykresu kawałek po kawałku, po jednej linii na raz, każda z różnych ramek danych i , a następnie przypisywanie kolorów do jest bardzo nieza-ggplot2 ish. Jeśli chcesz oznaczyć rzeczy w swoim wykresie z różnymi kolorami, pierwsza myśl powinna być zawsze:

Jak mogę kodować ten kolor informacje na etykiecie jako zmiennej?

W tym przypadku rozwiązanie jest dość proste. Wystarczy rbind dane trzech ramek razem (musisz upewnić się, że colnames dopasować pierwszy) i utworzyć nową kolumnę, powiedzmy grp że ma trzy poziomy odpowiadające swoich trzech ramek danych:

dat <- rbind(df1,df2,df3) 
dat$grp <- rep(factor(1:3),times = c(nrow(df1),nrow(df2),nrow(df3))) 

a następnie mapazmiennagrp do estetycznej koloru w wywołaniu ggplot:

ggplot(data = dat, aes(x=...,y=...,colour = grp) + 
    geom_line() 

wreszcie, jeśli nie podoba ci się domyślne kolory Można określić własne przy użyciu scale_colour_manual:

+ scale_colour_manual(value = c('green','blue','grey')) 

lub można użyć kilka ładnych palet „pre-wybrane” z scale_colour_brewer.

EDYCJA: Poprawiłem literówkę powyżej, aby upewnić się, że czynnikiem jest grp.Oto moja ostateczna wersja:

df1 = data.frame(c1 = c(1:5), c2 = c(1:5)) 
df2 = data.frame(c1 = c(1:5), c2 = (c(1:5))^0.5) 
df3 = data.frame(c1 = c(1:5), c2 = (c(1:5))^2) 

dat <- rbind(df1,df2,df3) 
dat$grp <- rep(factor(1:3),times=c(nrow(df1),nrow(df2),nrow(df3))) 

ggplot(data = dat, aes(x = c1, y = c2, colour = grp)) + 
    geom_line() 
0

Nie musisz się topić, grupa lub zebrać. To całkiem proste. Wystarczy dodać kolor do geom_line

library(tidyverse) 

df1 = data.frame(c11 = c(1:5), c12 = c(1:5)) 
df2 = data.frame(c21 = c(1:5), c22 = (c(1:5))^0.5) 
df3 = data.frame(c31 = c(1:5), c32 = (c(1:5))^2) 

p <- ggplot() + geom_line(data=df1, aes(x=c11, y = c12), color= "red") + 
    geom_line(data=df2, aes(x=c21,y=c22), color = "blue") + 
    geom_line(data=df3, aes(x=c31, c32), color = "green") 
p 

The result plot

Powiązane problemy