Czy istnieje sposób, aby linie geom_boxplot
linie, wąsy i punkty przegięcia dziedziczyły ten sam alpha
, który jest przypisany do boxplot fill
na poniższym wykresie?geom_boxplot: mapa poziomów alfa do bokobrodów i wartości odstających
Odpowiedz
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)
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ć:
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.
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
Cóż, zachowuje ducha gramatyki "ggplot", ale musisz wyjść poza normalny przepływ pracy ggplota, aby to zadziałało. – eipi10
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
możesz rzucić okiem na [to pytanie] (http://stackoverflow.com/questions/34601194/change-colours-to-defined-palette-for-ggplot-objects) z wcześniejszego dnia dzisiejszego – mtoto