2015-04-30 22 views
8

Soruma çok this ve this ve this sorusuna benzer. Belirli bir renk paletini kullanarak bir faktör tarafından renklendirilmiş bir dağılım grafiğim (geom_point kullanarak) var. Ben başka bir faktörü tarafından gruplandırılmış, noktalar üzerinden belirli düzgünleştirme çizgileri çizmek için stat_smooth kullanıyorum. Bu hatların farklı bir renk paleti kullanmasını istiyorum.İki farklı renk estetiği eşlemesi için farklı renk paletleri ggplot2 içinde

İşte bir Dropbox link to some example data. Sadece o de yarar değişim bulabilir böylece

currDT <- read.table("SO_data", sep = "|", header = TRUE, strip.white = TRUE) 

Genellikle, bir data.table benim veri var. Oh ve işte şu anda kullandığım renk şeması, kendi oluşturmak için scale_colour_brewer kullanabilirsiniz, sadece bu tamlık için dahil ediyorum.

my_col_scheme <- c("#e41a1c", "#377eb8", "#4daf4a", "#984ea3", "#ff7f00", "#7B8A7B", 
    "#0B29D6", "#f781bf", "#999999", "black") 

Umarım bu yeterince açıktır. İşte bir örnek kod:

Bu nasıl ggplot2'de yapılabilir? Topladığım diğer sorulardan her çizgiyi manuel olarak belirtebilirim, ama bundan kaçınmak isterim.

+0

[Tekrar üretilebilir bir örnek] ekleyebilir misiniz (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)? Sorunuz ilginç görünüyor, ancak bir göz atmak için sahte bir veri kümesi oluşturmak istemiyorum. –

+1

@RichardErickson İlginiz için teşekkürler, daha fazla bilgiye ihtiyacınız varsa, bunu bildirmekten memnuniyet duyarım, sadece bildirin. –

+0

Örnek için teşekkürler. Bir FYI olarak, alanı "sep =" | "' dan silmek zorunda kaldım. Bilgisayarım mı yoksa başka bir hata mı bilmiyorum (şu an bir Mac'tayım). Ayrıca, meraktan, bu verileri nereden alıyorsunuz? Bir enstrümanın geliyor mu? Ayırıcı olarak kullanılan bir '|' görmedim. –

cevap

10

Çizgiler ve noktalar için ayrı renk eşleştirmeleri, noktalar için doldurulmuş bir nokta işaretleyici kullanarak ve colour estetiği ile eşlenen çizgileri koruyarak, fill estetiği eşleştirerek alabilirsiniz. Dolgulu nokta işaretleyicileri 21'den 25'e kadar numaralandırılmış olanlardır (bakınız ?pch).İşte RichardErickson koduna @ adapte, bir örnek:

ggplot(currDT, aes(x = EFP, y = SAPT), na.rm = TRUE) + 
    stat_smooth(method = "lm", formula = y ~ x + 0, 
       aes(linetype = Halide, colour = Halide), 
       alpha = 0.8, size = 0.5, level = 0) + 
    scale_linetype_manual(name = "", values = c("dotdash", "F1"), 
         breaks = c("hal", "non-hal"), labels = c("Halides", "Non-Halides")) + 
    geom_point(aes(fill = Anion, shape = Cation), size = 3, alpha = 0.4, colour="transparent") + 
    scale_colour_manual(values = c("blue", "red")) + 
    scale_fill_manual(values = my_col_scheme) + 
    scale_shape_manual(values=c(21,24)) + 
    guides(fill = guide_legend(override.aes = list(colour=my_col_scheme[1:8], 
               shape=15, size=3)), 
     shape = guide_legend(override.aes = list(shape=c(21,24), fill="black", size=3)), 
     colour = guide_legend(override.aes = list(linetype=c("dotdash", "F1"))), 
     linetype = FALSE) 

İşte yaptıklarım bir açıklama verilmiştir:

geom_point yılında
  1. , fill için aesthestic colour değiştirin. Ayrıca, aes'un dışına colour="transparent" koyun. Bu noktaların etrafındaki sınırlardan kurtulacak. Bir kenarlık istiyorsanız, onu istediğiniz kenarlık rengine ayarlayın.
  2. scale_colour_manual'da renkleri mavi ve kırmızı olarak ayarlıyorum, ancak elbette bunları istediğiniz gibi ayarlayabilirsiniz.
  3. fill estetiğini kullanarak noktaların renklerini ayarlamak için scale_fill_manual'u ekleyin.
  4. scale_shape_manual'u ekleyin ve değerleri 21 ve 24 olarak ayarlayın (sırasıyla dolu daireler ve üçgenler).
  5. guides() içindeki tüm öğeler, efsaneyi değiştirmek içindir. Neden olduğundan emin değilim, ama bu geçersiz kılmalar olmadan, dolgu ve şekil için efsaneler boş. shape efsanesi içinnumaralı ayarı ayarladığımı, ancak gri olarak gösterildiğini unutmayın. Nedenini bilmiyorum ama fill="somecolor" olmadan shape açıklaması boştur. Son olarak, renk efsanesine linetype eklemek için colour10 efsanesini geçersiz kıldım, bu da gereksiz linetype efsanesinden kurtulmamı sağladı. Efsaneden hiç memnun değilim, ama özel makamlara gitmeden yapabileceğim en iyisiydi. enter image description here

    NOT

: Ben ayrı kenarlıklı bir noktayı kullanmak ve dolgu renklerini bile color=NA olarak noktalar tamamen kaybolmasına yol açtığı (sürümüne ggplot2 2 cinsinden), color="transparent" için color=NA değiştirdi. pointing this out için @aosmith'e teşekkürler.

+0

İyi iş! "Ggplot" un size sahip olduğunuz arsayı vermesi için yapmanız gereken korsanlık miktarından etkilendim. Dolgayı kullanmayı denedim, ama fark etmedim ki ben de 'rengini' 'NA' olarak değiştirdim. –

+0

Teşekkürler. Çalışmanın çoğu efsane ile güreşteydi. Noktaların etrafında bir kenarlık istemiyorsanız sadece 'color = NA' değerini eklemeniz gerekir. Eğer bir kenarlıktan sakıncası yoksa, 'renk = NA' değerini atlayabilir ve siyah bir kenarlık alabilir ya da rengi istediğiniz gibi ayarlayabilirsiniz. – eipi10

+0

Şerefe! Bu çok akıllıydı, 'renk' yerine 'dolum' kullanıyordu. İstediğim efsaneyi elde edebilecek kadar uzun süredir rehberlerle oynamamıştım. Bu iş yapıyor. Şimdilik en azından, çünkü her zaman diğer yöntemlere açıkım. –

3

ggplot2 sanırım rengi iki kez değiştirmenize ve efsaneyi güncellemenize izin vermez. Okumayı hatırlıyorum, bir arsada iki kez scale_color_manual değiştiremezsiniz. Bu web sayfasını bulamadım, ancak konuyla ilgili bu post dokunur. Ayrıca bu post önerilerini kullanmayı denedim, ancak çalışmadı. Muhtemelen geoms'u karıştırmaya çalıştığımız için (bu sadece bir tahmindir).

Ya regresyon çizgileri renkli alabilirsiniz:

part1 <- 
    ggplot(currDT, 
      aes(x = EFP, y = SAPT), na.rm = TRUE) + 
    stat_smooth(method = "lm", formula = y ~ x + 0, 
       aes(linetype = Halide, colour = Halide), 
       alpha = 0.8, size = 0.5, level = 0) + 
    scale_linetype_manual(name = "", values = c("dotdash", "F1"), 
          breaks = c("hal", "non-hal"), 
          labels = c("Halides", "Non-Halides")) + 
    scale_color_manual(name = "", values = c("red", 'blue'), 
         labels = c("Halides", "Non-Halides")) 
    ggsave('part1.jpeg', part1) 

enter image description here Veya veri noktaları çizmek için:

part2 <-   
    ggplot(currDT, 
      aes(x = EFP, y = SAPT), na.rm = TRUE) +  
    geom_point(aes(color = Anion, shape = Cation), size = 3, alpha = 0.4) + 
    scale_linetype_manual(name = "", values = c("dotdash", "F1"), 
          breaks = c("hal", "non-hal"), 
          labels =c("Halides", "Non-Halides")) + 
    scale_colour_manual(values = my_col_scheme) 
    ggsave('part2.jpeg', part2)      

enter image description here Ama ikisini birden:

both <- 
    ggplot(currDT, 
      aes(x = EFP, y = SAPT), na.rm = TRUE) + 
    stat_smooth(method = "lm", formula = y ~ x + 0, 
       aes(linetype = Halide, colour = Halide), 
       alpha = 0.8, size = 0.5, level = 0) + 
    scale_linetype_manual(name = "", values = c("dotdash", "F1"), 
         breaks = c("hal", "non-hal"), labels = c("Halides", "Non-Halides")) + 
    geom_point(aes(color = Anion, shape = Cation), size = 3, alpha = 0.4) + 
    scale_colour_manual(values = my_col_scheme)      
ggsave('both.jpeg', both) 

Her satır kılavuzunu eklemeniz gerekeceğini düşünüyorum. Umarım bir başkası buna nasıl cevap vereceğini bilir, ama ben de @hadley'nin her iki renge de değişmesine izin vermez. Neyse ki, data.table konum bu yüzden herkesten bu Umarım benim kısmi cevap çözmeye çalıştığı için

Yorum :-) yapmak kolay olmalı bu soruyu cevaplamak için yardımcı olur. Ayrıca, üçüncü rakam, ggplot2'un göstergesini OP'nin istediği şekilde doğru almadığını gösterir. Başka bir ipucu olarak, efsane seçenekleriyle oynamayı deneyebilirsiniz.

+0

'bölüm 1 ', doğru yerde doğru renklerin halide/halojen olmayan bir lejantı ile yazdırın, daha sonra bu efsaneyi devre dışı bırakılmış, şeffaf bir arka planla ve her ikisini de yazdırmayacak şekilde katyon ve halid efsaneleriyle yazdırın İlk efsane örtüşen? –

+0

Vay çaba için teşekkürler! evet, temelde bu soruyu sormadan önce bittiğim yerdi; Bu arada, çizgiler için hangi renkler ggplot2 kullanıyor? 'my_col_scheme' @geryan kullanarak görünmüyor, iki çizim oluşturmayı ve sonra onları diğerinin üzerine yerleştirmeyi mi öneriyorsunuz? Bu, R'nin kendisi içinde yapılabilir mi yoksa dışarıdan bir görüntü işleme programına mı bakacağız? –

+0

@SamuelTan, evet, bu benim önerdiğim şeydi, ama kendi kodumla denedim ve işe yaramazdım, üzgünüm. –

İlgili konular