2014-06-06 17 views
15

Her iki veri kümesini de gösterecek şekilde, alfa kanalları olan iki ggplot2 çizimini bindirmek istiyorum. Bu benim test verileridir:Alfa kanalları ile iki ggplot2 stat_density2d yerleşimlerini katlayın

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") 

Ve burada bu verileri çizmek nasıl:

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() 

ilk arsa verileri gösterir, ikinci arsa verilerine2:

Plot for dataset *data*Plot for dataset *data2*

Şimdi her iki grafiğin de bir birleşimini istiyorum. Aşağıdaki görüntü almak istediğim şey. Her iki görüntüyü katman olarak çarparak masaüstündeki görüntü düzenleme programımla ürettim.

Both datasets in one plot

ben üst üste bir veri setini çizdirmek çalıştı, ancak bu iki katmanı çarpma etmez ve ikinci renk ilkini üzerine yazar.

enter image description here

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") 

Ayrıca ben bu uyarıyı alıyorum: 'dolgu' için Ölçek zaten mevcuttur. Mevcut ölçeğin yerini alacak olan 'dolgu' için başka bir ölçek eklemek.

Bunu R'de yapmanın bir yolu var mı? Ya da bunu veya benzer bir sonucu elde etmek için başka bir yol var mı (örn. SmoothScatter gibi diğer işlevleri kullanarak)? Geçici çözüm bir tür olarak ben sunucuda ImageMagick kullanarak benzer bir sonuç elde edeceğiz düşünüyorum, ama iki katmandan çarpma 1

Güncelle

R.

içinde her şeyi tercih ederim ImageMagick'te bu şekilde yapılır;

composite -compose multiply data-red.png data-green.png im-multiply.png 

Bu, yukarıda gösterildiği gibi aynı sonucu verir.

Güncelleme 2

@Roland aynı arsa içinde iki veri setlerini çizmek nasıl onun cevabını öğretti. Bu harika olsa da, bir problem kalır: Görüntü, verileri arsaya beslediğiniz sıraya göre değişir.

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)) 

bu sonucu verir: First plot dataset "a" then dataset "b2".

hem veri setleri sırasını takas (şimdi veri kümesi "b", aka veri2 gelir, sonra veri kümesi veri aka "a") benzer bir sonuç elde edersiniz, ama şimdi kırmızı renk hakimdir, çünkü daha sonra çizilir ve böylece yeşil verilerin üzerine yazılır.

enter image description here

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)) 

Ben veri setleri sırasına bağlı değildir bir çözüm gerekir.

+1

contour_line Ne yazık ki: [ "anda parsel başına (x ve y, her şeyi önceden) Sadece bir ölçek olabilir"] (http://stackoverflow.com/a/3809071/1457051) . Ve, bu Hadley'den bu yana, muhtemelen iki parsel üretme ve ImageMagick ile dönüştürme ile sıkışmış bulunuyorsunuz. – hrbrmstr

+0

Bu bildirime beni işaretlediğiniz için teşekkür ederim. Sonra ImageMagick yoluna gideceğim. – z80crew

+0

Nihai rengi etkileyen yığının sırasını yeniden yazdığınızda, bu konuyla ilgili şu iplikler de var: http://www.mail-archive.com/[email protected]/msg84014.html En iyi çözüm Yığının renklerini kendiniz hesaplayın ve bunları çizin - ggplot2'de olmasa da bir örnek: http://stackoverflow.com/questions/13867782/superimpose-red-green-images-in-r-using-image-or -rasterimage –

cevap

4

aynı ölçekte hem yoğunlukları çizmek gerekir:

enter image description here

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)) 
Aksi takdirde veri çarpıtılmış bir portresini gösterir.

+0

gibi bir şey kullanarak bunları arsalar. Bu benim girişimlerimde muazzam bir gelişmedir. Teşekkür ederim. İki katın çoğalması ihtimali var mı? Kodunuzla, ikinci veri kümesi görsel olarak baskındır, dolayısıyla yeşil renk kırmızı olandan daha parlaktır. * Veri * ve * data2 * değiştirirseniz, kırmızı renk daha parlak olur. – z80crew

+0

Grup a'nın yerel yoğunluk maksimumu b grubundakilerden daha yüksektir. Arsa bunu yansıtıyor. "Kütük" ile ne demek istediğin hakkında hiçbir fikrim yok. – Roland

+0

Ama grup a'nın (kırmızı ile çizilen) maksimumu daha yüksek olduğunda, neden yeşil (grup b) daha parlak olur? Ve eğer kodunuzda * data * ve * data2 * 'i değiştirirseniz: 'rbind (data.frame (data2, group =" a "), data.frame (data, group =" b ")' ve 'values ​​= c ("b" = "# FF0000", "a" = "# 00FF00") '- sonra kırmızı, yeşilden daha parlaktır." Çarpanıma "ile, görüntü düzenlemesinde iki katman için karışım moduna başvuruyorum.Bu mod simetriktir. icra sırasının önemi yok – z80crew

9

Hattın önerdiğim durumlar dışında @Roland'dan tam olarak aynı çözüm. Bu, çakışmayı takdir etmenizi sağlar. geom_tile ve "çarpma" fikrinizin bunu nasıl değerlendirebildiğinizi göremiyorum. Çakışan olmayan alanlar için mavi ve kırmızı ve üst üste binen alan için "ağırlıklı" mor renk kullanırsanız. Ama sanırım bunu tahmin etmeden önce bir önceki adımda hesaplamanız gerekir.

ggplot(rbind(data.frame(data, group="a"), data.frame(data2, group="b")), 
     aes(x=x,y=y)) + 
    stat_density2d(geom="density2d", aes(color = group,alpha=..level..), 
       size=2, 
       contour=TRUE) + 
    #scale_color_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)) 
+0

"scale_file_manual" yerine "scale_fill_manual" –

+0

@ WilliamZhang anlamına geldiğinizi sanıyorum. Evet, teşekkürler. Roland'ın çözümü ve en ufak bir değişiklik yaptım.Tamı şimdi düzeltiyorum – Pierre

+0

Teşekkür ederim, bu ilginç bir görsel uygulama. oach. Gösterdiğim test verileri için iyi çalışıyor olsa da, bunun gerçek verilerim için yapacağından emin değilim. Yine de +1. – z80crew