Chcę nakładać dwa wykresy ggplot2
z kanałami alfa w taki sposób, aby wynikowy obraz pokazywał oba zbiory danych. To jest mój danych testowych:Nakładanie dwóch działek ggplot2 stat_density2d z kanałami alfa
data = read.table(text="P1 -1 0 4\nP2 0 0 2\nP3 2 1 8\nP4 -2 -2 6\nP5 0.5 2 12")
data2 = read.table(text="Q1 1 1 3\nQ2 1 -1 2\nQ3 -1 1 8")
colnames(data) = c("name","x","y","score")
colnames(data2) = c("name","x","y","score")
A oto jak wykreślić te dane:
ggplot(data, aes(x=x,y=y)) +
stat_density2d(data=data,geom="tile", aes(fill = ..density..,alpha=..density..), contour=FALSE) +
theme(legend.position="none") + scale_fill_gradient (low = "#FFFFFF", high = "#FF0000") +
xlim(-3,3) + ylim(-3,3) +
geom_point()
ggplot(data2, aes(x=x,y=y)) +
stat_density2d(data=data2,geom="tile", aes(fill = ..density..,alpha=..density..), contour=FALSE) +
theme(legend.position="none") +
scale_fill_gradient (low = "#FFFFFF", high = "#00FF00") +
xlim(-3,3) + ylim(-3,3) +
geom_point()
Pierwsza działka pokazuje dane, druga działka dane2:
Chcę teraz połączenie obu działek. Poniższy obraz jest tym, co chcę uzyskać. Wygenerowałem go za pomocą programu do edycji obrazów na komputerze, mnożąc oba obrazy jako warstwy.
próbowałem wykreślić jeden zestaw danych na drugim, ale to nie pomnożyć obie warstwy, a drugi kolor nadpisuje pierwszy.
ggplot(data, aes(x=x,y=y)) +
stat_density2d(data=data,geom="tile", aes(fill = ..density..,alpha=..density..), contour=FALSE) +
theme(legend.position="none") + scale_fill_gradient (low = "#FFFFFF", high = "#FF0000") +
xlim(-3,3) + ylim(-3,3) +
stat_density2d(data=data2,geom="tile", aes(fill = ..density..,alpha=..density..), contour=FALSE) +
scale_fill_gradient (low = "#FFFFFF", high = "#00FF00")
Dodatkowo mam to ostrzeżenie: Skala do 'wypełnienia' jest już obecny. Dodanie kolejnej skali dla "wypełnienia", która zastąpi istniejącą skalę.
Czy można to zrobić w R? Lub jest tam inny sposób (przy użyciu innych funkcji, takich jak np. SmoothScatter), aby uzyskać ten lub podobny wynik? Jako pewnego rodzaju obejście myślę, że będę uzyskać podobny rezultat przy użyciu ImageMagick na serwerze, ale wolałbym zrobić to w R.
Update 1
Mnożenie dwóch warstw jest wykonane w ImageMagick w ten sposób;
composite -compose multiply data-red.png data-green.png im-multiply.png
Daje to taki sam wynik, jak pokazano powyżej.
Aktualizacja 2
@Roland nauczył mnie w swojej odpowiedzi jak wykreślić dwa zestawy danych w obrębie tej samej działce. Chociaż jest to świetne, pozostaje jeden problem: Obraz zależy od kolejności, w jakiej dane są podawane na wykres.
ggplot(rbind(data.frame(data, group="a"), data.frame(data2, group="b")), aes(x=x,y=y)) +
stat_density2d(geom="tile", aes(fill = group, alpha=..density..), contour=FALSE) +
scale_fill_manual(values=c("a"="#FF0000", "b"="#00FF00")) +
geom_point() +
theme_minimal() +
xlim(-3.3, 3.3) + ylim(-3.3, 3.3) +
coord_cartesian(xlim = c(-3.2, 3.2), ylim = c(-3.2, 3.2))
daje ten wynik:
Kiedy zamiana kolejności obu zestawów danych (obecnie zbiór danych "b" aka dane2 nastąpi wcześniej, wówczas zbiór danych dane aka "a") , otrzymujesz podobny wynik, ale teraz dominuje kolor czerwony, ponieważ zostanie on wykreślony później i w ten sposób nadpisuje zielone dane.
ggplot(rbind(data.frame(data2, group="a"), data.frame(data, group="b")), aes(x=x,y=y)) +
stat_density2d(geom="tile", aes(fill = group, alpha=..density..), contour=FALSE) +
scale_fill_manual(values=c("b"="#FF0000", "a"="#00FF00")) +
geom_point() + theme_minimal() +
xlim(-3.3, 3.3) + ylim(-3.3, 3.3) +
coord_cartesian(xlim = c(-3.2, 3.2), ylim = c(-3.2, 3.2))
Potrzebuję rozwiązania, które nie zależą od kolejności zbiorów danych.
Niestety [ "Obecnie nie może być tylko jedna skala na powierzchni (na wszystko oprócz X i Y)"] (http://stackoverflow.com/a/3809071/1457051) . A ponieważ jest to Hadley, najprawdopodobniej naprawdę utknąłeś w generowaniu dwóch fabuł i konwersji z ImageMagick. – hrbrmstr
Dziękuję za skierowanie mnie do tego oświadczenia. Potem pójdę w stronę ImageMagick. – z80crew
Kolejność ułożenia stosu wpływającego na ostateczny kolor, istnieje również ten wątek na ten temat: http://www.mail-archive.com/[email protected]/msg84014.html Najlepszym rozwiązaniem byłoby obliczyć kolory samego stosu i narysować je - tutaj jest przykład, choć nie w ggplot2: http://stackoverflow.com/questions/13867782/superimpose-red-green-images-in-r-using-image-or -rasterimage –