2016-01-05 4 views

Odpowiedz

3

Nie jestem pewien, czy jest to naturalny sposób to zrobić w ciągu ggplot2, ale tutaj jest to hacky sposób: Kolor estetyczny określa kolor linii, wąsy i punktów odstających. Dodamy więc kolorystykę do fabuły. Jednakże ustawimy kolory ręcznie, aby zawierały sekwencję wartości alfa w definicjach kolorów. W rezultacie skutecznie dodajemy wartości alfa do estetyki kolorów. Zmapowałem estetykę na Species, dzięki czemu mogę mieć trzy różne poziomy alfa dla ilustracji i dodać theme_bw() dla lepszego kontrastu wartości alfa.

Najpierw ustawić wartości alfa chcemy w ostatnim wykresie:

numVals = length(unique(iris$Species)) 
avals = seq(0.9, 0.3, length.out=numVals) 

Oto Hack: Ustaw wszystkie kolory czarny, ale dodać sekwencję alfa poziomie definicji koloru. W tym celu musimy przekonwertować poziomy alfa na szesnastkowe w skali 0-255.

avalsHex = paste0("#000000", toupper(as.hexmode(round(avals*255)))) 

W powyższy kod avals*255 są poziomy alfa na 0 - skali 255. as.hexmode konwertuje te wartości na szesnastkowe. toupper nie jest bezwzględnie konieczne, ale jestem przyzwyczajony do wyświetlania heksadecymalnych definicji kolorów dużymi literami. Następnie wklejamy dwucyfrową liczbę heksadecymalną alfa na koniec koloru, w tym przypadku czarnego (#000000), który daje wektor trzech kolorów, które zawierają wartości alfa.

Nie mamy działki z obu kolorów i alfa estetyki i ręcznych wartości dla każdego estetyczna

ggplot(iris, aes(x = Species, y = Sepal.Length)) + 
    geom_boxplot(aes(color=Species, alpha = Species)) + 
    scale_alpha_manual(values = avals) + 
    scale_colour_manual(values = avalsHex) 

enter image description here

UPDATE: Aby rozwiązać swój komentarz, oto przykład z różnymi kolorami oprócz wartości alfa:

avalsHex = paste0(c("#FF0000","#00FF00","#0000FF"), toupper(as.hexmode(round(avals*255)))) 

Następnie wystarczy uruchomić ten sam kod kreślenia, aby otrzymać:

enter image description here

UPDATE 2: Myśląc o kolorach uświadomiły mi, że nie trzeba nawet konwersję do szesnastkowy, aby dodać na wartościach alfa. Na przykład, z hcl kolorach można to zrobić:

# Black boxplots with 3 different alpha levels 
scale_colour_manual(values = hcl(0,0,0, alpha=avals)) 

# Colored boxplots with 3 different alpha levels 
scale_colour_manual(values=hcl(seq(15,375,length.out=4)[1:3], 100, 65, alpha=avals)) 

hcl Funkcja zwraca kod hexdecimal dla każdego koloru, w efekcie dbanie o konwersji dla Ciebie.

+0

Nie tak Hacky, jak bałem się! Gdybym miał wektor o różnych kolorach wypełnienia (tj. Nie wszystkie zaczynające się od '# 000000'), czy ta metoda nadal działałaby?(przepraszam, to pierwsze zdanie zostało przedwcześnie opublikowane). – mdlincoln

+0

Cóż, zachowuje ducha gramatyki "ggplot", ale musisz wyjść poza normalny przepływ pracy ggplota, aby to zadziałało. – eipi10

+1

Aby odpowiedzieć na resztę komentarza: Tak. Możesz przydzielić dowolny poziom alfa do dowolnego koloru szesnastkowego, dodając dwie dodatkowe cyfry szesnastkowe. Zobacz aktualizację dla prostego przykładu. – eipi10