2011-11-25 8 views
18

Chciałbym wykonać wykres punktowy z 2 kategoriami danych, jedną z wykreśloną na żółto i jedna na niebiesko, a na zielono, gdzie się nakładają (lub jakakolwiek inna kombinacja). Odkryłem, że sprawy są trochę trudniejsze, nawet jeśli chodzi o przejrzystość. Na kolor wykresu wpływa to, czy ostatni punkt wykreślony w przestrzeni był niebieski czy żółty.W R, czy możliwe jest nałożenie 2 kolorów na wykresie, aby uzyskać trzeci (np. Z dodatkowym lub subtraktywnym mieszaniem kolorów)?

Na przykład następującego kodu:

col1 <- rgb(red = .0, green = 0, blue = 0.8, alpha = 0.8) 
col2 <- rgb(red = .8, green = 0.8, blue = 0, alpha = 0.8) 
circle <- data.frame(x = c(0.2,0), 
        y = c(0,0), 
        col = c(col1, col2), 
        stringsAsFactors = F) 
orders <- c(1,2) 
plot(x = circle$x[orders], y = circle$y[orders], 
    col = circle$col[orders], pch = 19, cex = 100, xlab = "", ylab = "") 

W zależności od tego, jak ustawić wektor orders (który określa się, w jaki sposób okrągłe dwa duże punkty są rysowane) można uzyskać różne wyniki: enter image description here

A jeśli zamienisz kolejność, w której narysujesz dwa kółka, otrzymasz: enter image description here

Tak czy inaczej, byłem mrówką icipating mieszanie kolorów, aby uzyskać zielony. Czy jest jakiś sposób na zrobienie tego? Dzięki!

Edytuj - dwie działki zostały wykonane przy użyciu urządzenia pdf. Próbowałem również uruchomić kod przez tikzDevice, aby sprawdzić, czy to działało, ale tak się nie stało.

+0

Pakiet 'colorspace' posiada funkcję' mixcolor' że będzie obliczyć wartość takiego mieszanego kolor: http://cran.r-project.org/web/packages/colorspace/colorspace.pdf. Nie wiem, jak to zrobić bezpośrednio - moje rozwiązania tego problemu polegały na znalezieniu innego sposobu wizualizacji danych, np. z 'hexbin', używając' facets' lub obliczając wynik netto w każdym punkcie. – Andrie

+2

To naprawdę nie jest odpowiedź, ale możesz spojrzeć na http://en.wikipedia.org/wiki/Alpha_compositing#Alpha_blending - Zakładam, że różne urządzenia (PDF, tikzDevice, PNG itp.) Używają wariacje na temat tego algorytmu, aby określić kolory nałożone i może pomóc zrozumieć, co się dzieje. –

+1

W szczególności, wymyśliłem, że po tych formułach trochę się mieszam, że mieszanie alfa nie jest przemienne (w rzeczywistości, jak wskazuje artykuł, w niektórych przypadkach nie jest to również skojarzenie, chociaż to nie ma znaczenia, ponieważ łączycie tylko dwa kolory) - co wyjaśnia powyższe wyniki "zamówień mających znaczenie". –

Odpowiedz

5

Plik pomocy dla urządzenia pdf() mówi, że domyślne ustawienie tła jest "przezroczyste", chociaż nie wydaje się to być jego zachowaniem w praktyce, być może dlatego, że widzowie zakładają białe tło lub może dlatego, że domyślne ustawienie dla funkcja fabuły jest "biała". Środkowa sekcja najpierw staje się kolorem, który jest równą mieszanką bieli i zieleni, a druga sekunda następnie dodajesz do niej niebieski. Zgaduję więc, że matematyka przewidywałaby wartość rgb (0,5, 0,5, (0,5 + 0,8)/2), a następnie zmieszanie tej mieszanki z nałożonym kolorem I myślę, że biały + col1 zostanie dodany w równych proporcjach do wartości z col2, co czyni matematykę nieprzemienną. W każdym razie wynik końcowy prawdopodobnie będzie inny, jeśli możesz zmusić tło do "przezroczystości". Domyślne zachowanie przypomina bardziej mieszanie farb niż świecące światła teatralne.

Model kolorów w formacie PDF jest opisany w dokumencie http://www.adobe.com/devnet/pdf/pdf_reference.html i określa, czego można oczekiwać od urządzenia PDF (ale niekoniecznie tego, co zapewni przeglądarka).

Testowałem moją teorię, że białe tło był problem (i wydaje się, że obalił go) poprzez zmianę tła na „czarno” w nadziei, że nie będzie żadnych wartości dodanych do warstwowych wektory RGB:

pdf("testfil12rev.pdf", bg="black") 
col1 <- rgb(red = .0, green = 0, blue = 1, alpha = 0.5) 
col2 <- rgb(red = 1, green = 0, blue = 0, alpha = 0.5) 
circle <- data.frame(x = c(0.2,0), 
        y = c(0,0), 
        col = c(col1, col2), 
        stringsAsFactors = F) 
orders <- c(1,2) 
plot(x = circle$x[orders], y = circle$y[orders], bg="black", 
     col = circle$col[orders], pch = 19, cex = 100, xlab = "", ylab = "") 

dev.off() 

Odwracanie wskaźnika "zamówienia" NIE spowoduje tego samego koloru mieszanego z czarnym tłem.

EDIT: Jest przed SO księgowania z zasadami do mieszania kolorów i Alfy: How to calculate an RGB colour by specifying an alpha blending amount?

+0

dzięki za referencję. Spróbuję eksperymentować z przezroczystymi ustawieniami. – Andrew

+0

Próbowałem przezroczystych ustawień ('png (" tmp.png ", bg =" przezroczysty ")') i to zmienia rzeczy (i prawdopodobnie pomoże w każdej eksploracji poprzez usunięcie współczynnika), ale wyniki nadal nie są przemienne i nadal nie odpowiadają oczekiwaniom naiwnym (niebieski + żółty = zielony), jak podano powyżej. –

Powiązane problemy