39 votes

En R, comment tracer avec un png comme fond ?

En R, a fait un tracé avec 3M points et l'a enregistré au format PNG. Cela a pris quelques heures et j'aimerais éviter de redessiner tous les points.

enter image description here

Comment puis-je générer un nouveau tracé qui a ce PNG comme arrière-plan ?

80voto

bill_080 Points 2670

Essayez ça :

library(png)

#Replace the directory and file information with your info
ima <- readPNG("C:\\Documents and Settings\\Bill\\Data\\R\\Data\\Images\\sun.png")

#Set up the plot area
plot(1:2, type='n', main="Plotting Over an Image", xlab="x", ylab="y")

#Get the plot information so the image will fill the plot box, and draw it
lim <- par()
rasterImage(ima, lim$usr[1], lim$usr[3], lim$usr[2], lim$usr[4])
grid()
lines(c(1, 1.2, 1.4, 1.6, 1.8, 2.0), c(1, 1.3, 1.7, 1.6, 1.7, 1.0), type="b", lwd=5, col="white")

Voici l'intrigue.

enter image description here

17voto

cbeleites Points 5667

Bien que la réponse de @bill_080 réponde directement à votre question, est-ce vraiment ce que vous voulez ? Si vous voulez tracer sur ce point, vous devrez aligner soigneusement vos systèmes de coordonnées. Voir par exemple Carte de la criminalité à Houston comment cela peut être fait avec ggplot2.

Pour votre problème, il me semble qu'il existe une solution plus simple : le binning, c'est-à-dire la création de 2 histogrammes.

> df <- data.frame (x = rnorm (1e6), y = rnorm (1e6))
> system.time (plot (df))
       User      System verstrichen 
     54.468       0.044      54.658 
> library (hexbin)
> system.time (binned <- hexbin (df, xbins=200))
       User      System verstrichen 
      0.252       0.012       0.266 
> system.time (plot (binned))
       User      System verstrichen 
      0.704       0.040       0.784

enter image description here

hexbin fonctionne directement avec lattice et ggplot2, mais les coordonnées centrales des bins sont en binned@xcm et binned@ycm Vous pouvez donc également tracer le résultat dans des graphiques de base. Avec un nombre élevé de bins, vous obtenez une version rapide de votre tracé original :

> system.time (plot (binned@xcm, binned@ycm, pch = 20, cex=0.4))
       User      System verstrichen 
      0.780       0.004       0.786 

enter image description here

mais vous pouvez facilement avoir les couleurs codant la densité :

> plot (binned@xcm, binned@ycm, pch = 20, cex=0.4, col = as.character (col))

> col <- cut (binned@count, 20)
> levels (col) <- grey.colors (20, start=0.9, end = 0)
> plot (binned@xcm, binned@ycm, pch = 20, cex=0.4, col = as.character (col))

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X