2011-11-08 10 views
41

Miałem to kilka razy, więc tutaj idzie: Robię kilka wykresów, które trzymają krzywe z oszacowaniami parametru z danym parametrem strojenia.Przejrzysty odpowiednik danego koloru

Zazwyczaj mam również SD dla każdej wartości szacunkowej, więc mogłem wyświetlić paski błędów wokół każdego z nich.

Nie lubię jednak pasków błędów i wolę wersję wygładzoną. Nie stanowi to problemu (tzn. Wiem, jak to zrobić). Jednak moja fabuła zawiera kilka podobnych krzywych, każda w swoim własnym kolorze. Dlatego chciałbym dodać "wygładzony region błędu" do każdej krzywej w kolorze, który pasuje do koloru samej krzywej. Oczywiście chciałbym to zrobić w sposób przejrzysty, więc nadal widzę inne krzywe w "regionie błędu".

Moje pytanie brzmi: biorąc pod uwagę kolor (określony przez liczbę, nazwę lub wartość rgb - uwaga pierwsze dwa stanowią dodatkowy problem, ale zdarza się to często, jako podstawowe funkcje kreślenia weź te wartości jako prawidłowe), jak znaleźć znajdujący się pasujący kolor, który ma ten sam rgb, ale inny (dany) poziom alfa (przezroczystość). Chciałbym funkcji takich jak:

makeTransparent<-function(someColor, alpha=100) 
{ 
    newColor<-someColor + alpha #I wish 
    return(newColor) 
} 

To powinno działać na takie rzeczy jak:

makeTransparent(2) 
makeTransparent("red") 
makeTransparent(rgb(0,0,1)) 

Edytuj Nienawidzę, kiedy tęsknię za coś oczywistego, ale @themel wskazał mi do niego (thx ponownie). Oto pełne rozwiązanie (Uwaga: Prace wektorowy, więc można przekazać więcej niż jeden kolor, tylko jeden alfa jest obsługiwana w tym czasie choć):

#note: always pass alpha on the 0-255 scale 
makeTransparent<-function(someColor, alpha=100) 
{ 
    newColor<-col2rgb(someColor) 
    apply(newColor, 2, function(curcoldata){rgb(red=curcoldata[1], green=curcoldata[2], 
    blue=curcoldata[3],alpha=alpha, maxColorValue=255)}) 
} 
+1

'ggplot2 :: alpha()' może? – baptiste

+2

W 'skalach też jest' alpha', może są one powiązane. Ten jest skalą ma naprawdę fajny interfejs. Jest dość elastyczny w swoim wkładzie.Myślę, że każde wyrażenie w postaci 'plot (dane, col = kolory)' może być zastąpione 'plot (dane, col = alpha (kolory, 0.5)), aby uzyskać 50% przezroczystości. Działa to nawet wtedy, gdy 'colors' jest po prostu wektorem liczb całkowitych, które wybierają kolor ze standardowej palety. –

+0

nieco powiązane (według Google tak) i które znalazłem bardzo przydatne: https://gist.github.com/mages/5339689/raw/576263b8f0550125b61f4ddba127f5aa00fa2014/add.alpha.R – PatrickT

Odpowiedz

36

Miałeś spojrzeć na ?rgb?

Zastosowanie:

RGB (czerwony, zielony, niebieski, a nazwy = NULL maxColorValue = 1)

się współczynnik przezroczystości alfa może być określony (jak nieprzezroczystość, tak ' 0 'oznacza całkowicie przezroczysty, a "max" oznacza nieprzezroczysty). Jeśli nie podano alpha ', generowany jest nieprzezroczysty kolor.

Parametr alpha służy do określania przezroczystości. col2rgb dzieli R kolorów określonych w inny sposób na RGB, dzięki czemu można je podać do rgb.

+0

'col2rgb' było tym czego mi brakowało - musiałem to przeczytać :-(Nie spodziewałbym się, że to będzie działać na kolorach już w formacie rgb. Zmienię moje własne pytanie tak, aby zawierało pełną odpowiedź opartą na twojej .. –

+0

Nie wiedziałem o 'col2rgb' , to jest naprawdę użyteczne! –

+1

W moim przypadku konieczne było również przeniesienie wartości zwracanej przez col2rgb() i przekazanie argumentu maxColorValue dla normalizacji: rgb (t (col2rgb (c ("czerwony", "zielony"))), alpha = 100 , maxColorValue = 255) –

3

Myślę, że jest bardziej powszechne określenie alpha w [0,1]. Ta funkcja to zrobić, a także przyjąć kilka kolorów jako argumenty:

makeTransparent = function(..., alpha=0.5) { 

    if(alpha<0 | alpha>1) stop("alpha must be between 0 and 1") 

    alpha = floor(255*alpha) 
    newColor = col2rgb(col=unlist(list(...)), alpha=FALSE) 

    .makeTransparent = function(col, alpha) { 
    rgb(red=col[1], green=col[2], blue=col[3], alpha=alpha, maxColorValue=255) 
    } 

    newColor = apply(newColor, 2, .makeTransparent, alpha=alpha) 

    return(newColor) 

} 

A do testu:

makeTransparent(2, 4) 
[1] "#FF00007F" "#0000FF7F" 
makeTransparent("red", "blue") 
[1] "#FF00007F" "#0000FF7F" 
makeTransparent(rgb(1,0,0), rgb(0,0,1)) 
[1] "#FF00007F" "#0000FF7F" 

makeTransparent("red", "blue", alpha=0.8) 
[1] "#FF0000CC" "#0000FFCC" 
45

Istnieje funkcja adjustcolor w grDevices pakietu, który działa jak to w Twoim przypadku:

adjustcolor("red", alpha.f = 0.2) 
+1

Bardzo prosty i łatwy w użyciu: miły dla mnie, dzięki. – jcfaria