2012-05-29 5 views
31

Prawdopodobnie istnieje bardzo proste rozwiązanie mojego problemu, ale nie mogłem znaleźć satysfakcjonującej odpowiedzi w Internecie.Dodaj kolor do boxplot - "Ciągła wartość dostarczana w dyskretnej skali" błąd

pomocą następującego polecenia udało mi się utworzyć następujący boxplot wykres i pokryjesz je z poszczególnymi punktami danych:

ggplot(data = MYdata, aes(x = Age, y = Richness)) + 
    geom_boxplot(aes(group=Age)) + 
    geom_point(aes(color = Age)) 

Jest kilka rzeczy, które chciałbym dodać/zmienić:

1. Zmień kolor linii i/lub wypełnienia każdego pola (w zależności od "Wiek"), używając 6 różnych kolorów od lewej do prawej:

c("#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00") 

Próbowałem

ggplot(data = MYdata, aes(Age, Richness)) + 
    geom_boxplot(aes(group=Age)) + 
    scale_colour_manual(values = c("#E69F00", "#56B4E9", "#009E73", 
           "#F0E442", "#0072B2", "#D55E00")) 

ale skutkuje błędem "Continuous value supplied to discrete scale".

2. zmienić kolor każdego punktu danych (w zależności od "Age") za pomocą 6 różnych kolorach, od lewej do prawej:

c("#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00") 

Próbowałem:

ggplot(data = MYdata, aes(Age, Richness)) + 
    geom_boxplot(aes(group=Age)) + 
    geom_point(aes(color = Age)) + 
    scale_colour_manual(values = c("#E69F00", "#56B4E9", "#009E73", 
           "#F0E442", "#0072B2", "#D55E00")) 

ale również powoduje błąd:

Continuous value supplied to discrete scale

3. Zmień tekst w legendzie na "0 miesiąc", "1 miesiąc", "3 miesiące", "6 miesięcy", "9 miesięcy", "12 miesięcy"

Odpowiedz

48

Po pierwsze, dostarczenie przykładowych danych Wsparcie. Ponieważ tego nie zrobiłeś, oto kilka:

MYdata <- data.frame(Age = rep(c(0,1,3,6,9,12), each=20), 
        Richness = rnorm(120, 10000, 2500)) 

Części 1 i 2 wynikają z tego samego problemu. Age jest zmienną ciągłą, ale próbujesz użyć jej w dyskretnej skali (określając kolor dla określonych wartości wieku). Ogólnie skala odwzorowuje zmienną na wizualną; przez cały wiek istnieje odpowiedni kolor dla każdej możliwej wartości wieku, a nie tylko te, które pojawiają się w twoich danych. Można jednak traktować wiek jako kategoryczną zmienną (czynnik) dla niektórych estetyki. W trzeciej części pytania w opisie skali można zdefiniować konkretne etykiety odpowiadające określonym podziałom w skali. Wyrażając to wszystko razem (i dodając coś dać oś x oznaczony więcej jak to, co masz w przykładzie):

ggplot(data = MYdata, aes(x = Age, y = Richness)) + 
    geom_boxplot(aes(fill=factor(Age))) + 
    geom_point(aes(color = factor(Age))) + 
    scale_x_continuous(breaks = c(0, 1, 3, 6, 9, 12)) + 
    scale_colour_manual(breaks = c("0", "1", "3", "6", "9", "12"), 
         labels = c("0 month", "1 month", "3 months", 
           "6 months", "9 months", "12 months"), 
         values = c("#E69F00", "#56B4E9", "#009E73", 
           "#F0E442", "#0072B2", "#D55E00")) + 
    scale_fill_manual(breaks = c("0", "1", "3", "6", "9", "12"), 
         labels = c("0 month", "1 month", "3 months", 
           "6 months", "9 months", "12 months"), 
         values = c("#E69F00", "#56B4E9", "#009E73", 
           "#F0E442", "#0072B2", "#D55E00")) 

enter image description here

Z tego schematu kolorów, punkty, które wchodzą do wnętrza boxplot są niewidoczne (ponieważ są one tego samego koloru, co wypełnienie pudełka). Być może lepsze będzie pozostawienie pustej planszy i rysowanie jej linii w kolorze.

ggplot(data = MYdata, aes(x = Age, y = Richness)) + 
    geom_boxplot(aes(colour=factor(Age)), fill=NA) + 
    geom_point(aes(color = factor(Age))) + 
    scale_x_continuous(breaks = c(0, 1, 3, 6, 9, 12)) + 
    scale_colour_manual(breaks = c("0", "1", "3", "6", "9", "12"), 
         labels = c("0 month", "1 month", "3 months", 
           "6 months", "9 months", "12 months"), 
         values = c("#E69F00", "#56B4E9", "#009E73", 
           "#F0E442", "#0072B2", "#D55E00")) 

enter image description here

Wreszcie, należy rozważyć, czy naprawdę trzeba pokolorować każdy wiek inaczej, ponieważ są one dobrze zdefiniowane przez oś x już.

+1

Dziękuję bardzo, Brian! Naprawdę nie wiem (jeszcze) jak wygenerować losowy zestaw danych w R. Dzięki za podjęcie to mimo to! Mam pytanie uzupełniające w oparciu o Twoją sugestię, aby pola były puste. Jak mogę zmienić kolor LINE każdego pudełka (np. Na szary)? Zmieniłem kolor wypełnienia za pomocą geom_boxplot (aes (color = factor (Age)), fill = "gray80"). Następnie wypróbowano scale_colour_manual (breaks = c ("0", "1", "3", "6", "9", "12"), wartości = c ("szaro80", "szaro80", "szaro80", " gray80 "," gray80 "," grey80 ")), ale punkty danych również stały się szare. Oczywiście chciałbym, aby punkty były kolorowe. – Dalmuti71

+1

'geom_boxplot (aes (pozycja = czynnik (wiek)), kolor =" szary ", wypełnienie = NA)' lub 'geom_boxplot (aes (grupa = czynnik (wiek)), kolor =" szary ", wypełnienie = NA)' –

+0

Dzięki, Sandy! Tylko dla własnego zrozumienia: co robi "position = factor (Age)" lub "group = factor (Age)", aby móc określić kolor linii? – Dalmuti71

Powiązane problemy