2010-02-02 14 views
27

Belirli bir küçük resmi ggplot2 ile bir dağılım grafiğinde nokta olarak kullanmanın bir yolu var mı. İdeal olarak görüntüleri bir değişkene göre yeniden boyutlandırmak istiyorum. İşte Ggplot'ta bir görüntü nasıl kullanılır?

bir örnek:

library(ggplot2) 
p <- ggplot(mtcars, aes(wt, mpg)) 
p + geom_point(aes(size = qsec, shape = factor(cyl))) 

Yani temelde şekil olarak belirli bir resim sunmaya bir yol olup olmadığını bilmek istiyorum?

cevap

5

Öncelikle burada cevap var:

nasıl iyi veri farklılaşmayı temsil etmek aletler kullanmak nasıl kullanılacağını göstermek için, ben R grafiği galerisinde .:

de chernoff faces örneğinde sevk Bu örneği oluşturmak için bu sitedeki tüm kodlar sitede bulunmaktadır. Alternatif

, basit bir widget için ggplot en stat_spoke bak: alt text http://had.co.nz/ggplot2/graphics/706b1badf6469940342f204b7bc98857.png

grImport puan olarak kullanmak için arsa içine basit PDF görüntüleri almak için bir mekanizma sağlar.

Şimdi, örneğinizin bir eleştirisini izler.


Bu, bir dağılım çizgilidir. Esas olarak, metin değişkenlerinden birini belirtmek için rengin kullanıldığı sıralı veri noktalarının akan bir listesidir ve verileri çerçevelemek için bir dezenfektan ve yedek widget kullanıldı, ancak boyut veya şekil açısından görsel bir geri bildirim sağlanmadı. Bu, iyi bir grafik değildir, çünkü "Daha İyi Sonuçlara Daha Fazla Kurşun Ödüyor mu?" Sorusunu cevaplamak tamamen başarısız oluyor ve okuyucuyu bu sonuca (ve gerektiğinde başka bir şemaya) çekiyor . Buna ek olarak, yazarlar x, y eksenlerini boşa harcadılar - ki bu, öğelerin giden ve sonuçlara göre konumlandırılması için iyi kullanılmış olabilir, paranın karşılığının görsel bir şekilde anlaşılması için. Bunun yerine, simgeleri başı maliyet başına ortalama mezuniyet oranına göre sıralamayı tercih ettiler, bu da yararlı bir şeydi, ancak belirtilen soruya cevap vermiyordu ve kolejler arasındaki göreli oranın doğrudan görsel olarak karşılaştırılmasına izin vermediler. maliyet ve değer arasındaki ilişki.

Söylediğim gibi, bence, bu kötü bir grafiktir ve okuyucularınız size çoğaltarak iyi servis edilmeyecektir.

+0

Cevabınız için teşekkürler! Bu bağlantıyı kaldırdım çünkü haklı olduğunuzu düşünüyorum. Daha genel olarak, bir şeyi kaçırmadığım sürece, yüzler() işlevi gibi görünmüyor, ya da stat_spoke gerçekten ihtiyacım olanı ifade etmiyor. yüzler() sadece yüzleri gösterir ... görüntüyü değiştiremezsiniz. Stat_spoke da resmi değiştirmenize izin vermez. Fakat grImport çok umut verici görünüyor! Teşekkürler! – griffin

+3

Görüntü bağlantılarınız bozuk… Onları düzeltmeye çalışırken biraz uğraştım ama başarısız oldu. – joran

+3

Bu sorunun cevabın artık mantıklı olmadığı derecesine göre düzenlenmiş gibi görünüyor; görüntülere kopuk olmasının yanı sıra. –

16

İşte

library(ggplot2) 
library(grid) 

## replace by a named list with matrices to be displayed 
## by rasterGrob 
.flaglist <- list("ar" = matrix(c("blue", "white", "blue"), 1), 
        "fr" = matrix(c("blue", "white", "red"), 1)) 

flagGrob <- function(x, y, country, size=1, alpha=1){ 
    grob(x=x, y=y, country=country, size=size, cl = "flag") 
} 

drawDetails.flag <- function(x, recording=FALSE){ 

    for(ii in seq_along(x$country)){ 
    grid.raster(x$x[ii], x$y[ii], 
       width = x$size[ii]*unit(1,"mm"), height = x$size[ii]*unit(0.5,"mm"), 
       image = .flaglist[[x$country[[ii]]]], interpolate=FALSE) 
    } 
} 


scale_country <- function(..., guide = "legend") { 
    sc <- discrete_scale("country", "identity", scales::identity_pal(), ..., guide = guide) 

    sc$super <- ScaleDiscreteIdentity 
    class(sc) <- class(ScaleDiscreteIdentity) 
    sc 
} 

GeomFlag <- ggproto("GeomFlag", Geom, 
        required_aes = c("x", "y", "country"), 
        default_aes = aes(size = 5, country="fr"), 

        draw_key = function (data, params, size) 
        { 
         flagGrob(0.5,0.5, country=data$country, size=data$size) 
        }, 

        draw_group = function(data, panel_scales, coord) { 
         coords <- coord$transform(data, panel_scales)  
         flagGrob(coords$x, coords$y, coords$country, coords$size) 
        } 
) 

geom_flag <- function(mapping = NULL, data = NULL, stat = "identity", 
         position = "identity", na.rm = FALSE, show.legend = NA, 
         inherit.aes = TRUE, ...) { 
    layer(
    geom = GeomFlag, mapping = mapping, data = data, stat = stat, 
    position = position, show.legend = show.legend, inherit.aes = inherit.aes, 
    params = list(na.rm = na.rm, ...) 
) 
} 


set.seed(1234) 
d <- data.frame(x=rnorm(10), y=rnorm(10), 
       country=sample(c("ar","fr"), 10, TRUE), 
       stringsAsFactors = FALSE) 


ggplot(d, aes(x=x, y=y, country=country, size=x)) + 
    geom_flag() + 
    scale_country() 

enter image description here

(ggflags paketinden çıktı)

2

bunu ggimage adında bir kütüphane bulunmaktadır punto yerine raster görüntüleri görüntülemek için minimalist geom bu.Bkz Bir intro vignette here

Sadece bilgisayarınızda yerel web üzerinde depolanan veya olabilir görüntülerin adresi ile senin data.frame bir sütun eklemek zorunda ve sonra geom_image() kullanabilirsiniz

:

library("ggplot2") 
library("ggimage") 

# create a df 

set.seed(2017-02-21) 
d <- data.frame(x = rnorm(10), 
       y = rnorm(10), 
       image = sample(c("https://www.r-project.org/logo/Rlogo.png", 
           "https://jeroenooms.github.io/images/frink.png"), 
           size=10, replace = TRUE) 
       ) 
# plot2 
    ggplot(d, aes(x, y)) + geom_image(aes(image=image), size=.05) 

enter image description here

ps. ggimage'un EBImage'a bağlı olduğunu unutmayın. gginamge'u yüklemek için bunu yapmam gerekiyordu:

# install EBImage 
    source("https://bioconductor.org/biocLite.R") 
    biocLite("EBImage") 
# install ggimage 
    install.packages("ggimage") 
İlgili konular