2010-02-02 14 views
27

Gibt es eine Möglichkeit, ein bestimmtes kleines Bild als Punkt in einem Streudiagramm mit ggplot2 zu verwenden. Idealerweise werde ich die Bilder basierend auf einer Variablen skalieren.Wie verwende ich ein Bild als einen Punkt in ggplot?

Hier ist ein Beispiel:

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

Deshalb möchte ich im Grunde wissen, ob es einen Weg gibt, ein bestimmtes Bild als die Form zu liefern?

Antwort

5

Zuerst ist hier Ihre Antwort:

Ihnen zu zeigen, wie zu verwenden, wie Sie besser Widgets verwenden, können Daten Differenzierung darzustellen, verweise ich Sie auf das Beispiel von chernoff faces an der R Graph Galerie .:

alt text http://addictedtor.free.fr/graphiques/graphiques/graph_87.png

Der gesamte Code zum Generieren dieses Beispiels ist auf der Website verfügbar.

Alternativ schauen die ggplot stat_spoke für ein einfaches Widget: alt text http://had.co.nz/ggplot2/graphics/706b1badf6469940342f204b7bc98857.png

grImport stellt einen Mechanismus einfache PDF-Bilder in Ihrem Grundstück für die Verwendung als Punkte zu importieren.

Nun folgt eine Kritik an Ihrem Beispiel.


Dies ist kein Streudiagramm. Es handelt sich im Wesentlichen um eine Liste von geordneten Datenpunkten, bei der Farbe für eine der Textvariablen verwendet wird. Ein nicht informatives und redundantes Widget wurde verwendet, um die Daten zu umrahmen, aber ansonsten keine visuelle Rückmeldung in Bezug auf Größe oder Form.

Es ist kein gutes Diagramm, weil es vollständig die angegebene Frage "Führt zu mehr Ergebnissen führt" nicht beantwortet, und lässt den Leser zu kämpfen, ziehen Sie diese Schlussfolgerung (und das andere Diagramm, wie notwendig) von sich .

Darüber hinaus haben die Autoren die x, y-Achsen verschwendet - die hätten gut verwendet werden können, um Elemente durch ausgehende und Ergebnisse zu positionieren, um ein visuelles Verständnis von Preis-Leistungs-Verhältnis zu bieten. Stattdessen haben sie sich dafür entschieden, die Icons nach dem Verhältnis von Pro-Kopf-Kosten zu durchschnittlicher Abschlussrate anzuordnen, was zwar sinnvoll ist, aber die gestellte Frage nicht beantwortet und keinen direkten visuellen Vergleich des relativen Verhältnisses zwischen den Colleges erlaubt die Beziehung zwischen Kosten und Wert.

Wie ich sage, ist dies meiner Meinung nach eine schlechte Grafik, und Ihre Leser wären nicht gut bedient, wenn Sie es replizieren.

+0

Danke für die Antwort! Ich habe diesen Link entfernt, weil ich denke, dass Sie Recht haben. Allgemeiner, es sei denn, ich verpasse etwas, es scheint nicht, dass die faces() -Funktion, noch stat_spoke wirklich meine Bedürfnisse ansprechen. faces() zeigt nur Gesichter ... Sie können das Bild nicht ändern. Mit stat_spoke können Sie das Bild auch nicht ändern. Aber grImport sieht sehr vielversprechend aus! Vielen Dank! – griffin

+3

Ihre Bildverknüpfungen sind kaputt ... Ich stocherte ein wenig herum, versuchte sie zu beheben, war aber nicht erfolgreich. – joran

+3

Es sieht so aus, als ob die Frage so bearbeitet wurde, dass die Antwort keinen Sinn mehr macht; sowie gebrochene Links zu Bildern. –

16

Hier ist ein minimalistischer geom Rasterbilder statt Punkte angezeigt werden,

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

(Ausgabe vom ggflags Paket)

2

Es gibt eine Bibliothek ggimage genannt, das zu tun.Sehen Sie eine intro vignette here

Sie müssen nur eine Spalte zu Ihrer data.frame mit der Adresse der Bilder ein, die auf dem Web gespeichert werden können, auf Ihrem Computer oder lokal und dann können Sie die geom_image() verwenden:

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. Beachten Sie, dass ggimage von EBImage abhängt. So zu installieren gginamge Ich musste dies tun:

# install EBImage 
    source("https://bioconductor.org/biocLite.R") 
    biocLite("EBImage") 
# install ggimage 
    install.packages("ggimage") 
Verwandte Themen