2016-03-21 21 views
2

Şu anda özel görüntüleri içe aktararak ve this post benzeri geom_points olarak kullanarak ggplot2 içinde plotlar oluşturuyorum, ancak farklı düzeylerde bir faktör için farklı görüntülerden geçiyorum.İçe aktarılan resimlerle özel gösterge

Bu görüntüleri efsaneye eklemenin kolay bir yolu var mı? Ggplot2'deki özel efsaneler üzerinde birçok yayın gördüm, ancak içe aktarılan resimlerle ilgilenen hiçbir şey yok.

+3

_ "Efsaneye bu görüntüleri eklemek için kolay bir yol var mı, birinin yerine? "Ben öyle düşünmüyorum, sanırım komplo bölgesini dışarıda bırakarak kırpma/devre dışı bırakmayı devre dışı bırakarak ve sonra kendi efsanenizi oluşturarak yolunuzu kesmek zorunda kalacaksınız. Ama ben de bilmek isterim. – lukeA

+0

Bu cevap yararlı olabilir: http://stackoverflow.com/a/36172385/471093 (ayrıca ilke kanıtı olarak [ggflags paketi] (https://github.com/baptiste/ggflags)) – baptiste

cevap

7

Çiziminizi oluşturmaya nasıl başlayacağınızdan emin değilim, ancak bu bir efsane anahtarını bir görüntüyle değiştirmenin bir yöntemini gösterir. Bu efsane anahtar Grobs içeren viewports bulmak için grid işlevlerini kullanır ve R logosu

library(png) 
library(ggplot2) 
library(grid) 

# Get image 
img <- readPNG(system.file("img", "Rlogo.png", package="png")) 

# Plot 
p = ggplot(mtcars, aes(mpg, disp, colour = factor(vs))) + 
    geom_point() + 
    theme(legend.key.size = unit(1, "cm")) 

# Get ggplot grob 
gt = ggplotGrob(p) 
grid.newpage() 
grid.draw(gt) 

# Find the viewport containing legend keys 
current.vpTree() # not well formatted 
formatVPTree(current.vpTree()) # Better formatting - see below for the formatVPTree() function 

    # Find the legend key viewports 
    # The two viewports are: 
     # key-4-1-1.5-2-5-2 
     # key-3-1-1.4-2-4-2 

# Or search using regular expressions 
Tree = as.character(current.vpTree()) 
pos = gregexpr("\\[key.*?\\]", Tree) 
match = unlist(regmatches(Tree, pos)) 

match = gsub("^\\[(key.*?)\\]$", "\\1", match) # remove square brackets 
match = match[!grepl("bg", match)] # removes matches containing bg 

# Change one of the legend keys to the image 
downViewport(match[2]) 
grid.rect(gp=gpar(col = NA, fill = "white")) 
grid.raster(img, interpolate=FALSE) 
upViewport(0) 

enter image description here

# Paul Murrell's function to display the vp tree 
formatVPTree <- function(x, indent=0) { 
    end <- regexpr("[)]+,?", x) 
    sibling <- regexpr(", ", x) 
    child <- regexpr("[(]", x) 
    if ((end < child || child < 0) && (end < sibling || sibling < 0)) { 
     lastchar <- end + attr(end, "match.length") 
     cat(paste0(paste(rep(" ", indent), collapse=""), 
        substr(x, 1, end - 1), "\n")) 
     if (lastchar < nchar(x)) { 
      formatVPTree(substring(x, lastchar + 1), 
         indent - attr(end, "match.length") + 1) 
     } 
    } 
    if (child > 0 && (sibling < 0 || child < sibling)) { 
     cat(paste0(paste(rep(" ", indent), collapse=""), 
        substr(x, 1, child - 3), "\n")) 
     formatVPTree(substring(x, child + 1), indent + 1) 
    } 
    if (sibling > 0 && sibling < end && (child < 0 || sibling < child)) { 
     cat(paste0(paste(rep(" ", indent), collapse=""), 
        substr(x, 1, sibling - 1), "\n")) 
     formatVPTree(substring(x, sibling + 2), indent) 
    } 
} 
+0

Harika! Bunu otomatikleştirmeye çalışıyorum, ancak formatVPTree (current.vpTree()) çıktısını bir listeye yazamıyor gibi görünmüyor; Sadece konsola yazdırır. Bunun nasıl yapıldığına dağir fikri olan? – RH2015

+0

Nevermind, eminim daha iyi bir yol var ama capture.output'u buldum (formatVPTree (current.vpTree())) ve sadece boşlukları kırpmalıyım – RH2015

+2

Gerekli olanı arayacak bir kod ekledim düzenli ifadeler kullanarak görünüm adları. –

İlgili konular