image - with - Guardar parcelas en R como GIF
image processing with r (1)
En R, utilizo la función savePlot
para guardar gráficos en archivos de imagen. Pero mi colega solo puede abrir .jpgs y .gifs (probablemente porque está de vacaciones, leyendo correos electrónicos en su teléfono móvil). Odio crear jpegs porque especialmente los diagramas de caja se ven muy feos (bigotes borrosos, etc.). Pero la función savePlot
solo admite los siguientes tipos:
type = c("wmf", "emf", "png", "jpg", "jpeg", "bmp",
"tif", "tiff", "ps", "eps", "pdf")
¿Cómo puedo guardar el diagrama en GIF en R?
EDITAR: si es posible, la solución ideal debería funcionar sin instalar ImageMagick (para que el script R sea fácilmente portable).
R no tiene un controlador de gráficos GIF nativo, en su mayoría (¿completamente?) Debido a los obstáculos de patente del formato GIF: ver http://tolstoy.newcastle.edu.au/R/help/05/02/12809. html .
Hay una función en el paquete caTools
( write.gif()
) pero está específicamente diseñada para escribir imágenes. Si querías usarlo, tienes que hacer algo raro para convertir tu trama a una imagen primero (por ejemplo, guardar como PNG y luego volver a leerla en R como imagen). Por ejemplo:
png("myPlot.png")
plot(rnorm(1000),rnorm(1000))
dev.off()
library(png)
P1 <- readPNG("myPlot.png")
library(caTools)
write.gif(P1,"myPlot.gif")
showGIF <- function(fn) system(paste("display",fn))
showGIF("myPlot.gif")
unlink("myPlot.gif") ## clean up
?write.gif()
tiene muchas cosas sobre indexación de color que no leí pero que podrían ser importantes para gráficos más complejos ...
El paquete de animation
tiene una función saveGIF()
para guardar GIF, pero (1) está diseñado para guardar animaciones de cuadros múltiples (no gráficos generales), y (2) lo hace llamando a ImageMagick.
Es más fácil construir esa función tú mismo.
- instale ImageMagick ( http://imagemagick.org )
- guardar como PNG, luego use ImageMagick para convertir.
Por ejemplo:
png("myPlot.png")
plot(rnorm(1000),rnorm(1000))
dev.off()
system("convert myPlot.png myPlot.gif")
unlink("myPlot.png") ## clean up
showGIF("myPlot.gif")
unlink("myPlot.gif") ## clean up
Por supuesto, puede cualquiera de estos en una función si desea usarlos regularmente.
ACTUALIZACIÓN : He gastado un poco más de tiempo en esto, para intentar obtener una solución R pura, pero todavía no tengo una solución funcional. Sugerencias o ediciones bienvenidas ...
## needs ImageMagick: just for testing ...
showGIF <- function(fn) system(paste("display",fn))
La función principal:
saveGIF <- function(fn,verbose=FALSE,debug=FALSE) {
require(png)
require(caTools)
tmpfn <- tempfile()
on.exit(unlink(tmpfn))
savePlot(tmpfn,type="png")
P1 <- readPNG(tmpfn)
dd <- dim(P1)
P1 <- aperm(P1,c(3,1,2),resize=TRUE) ## P1[,1,15]
dim(P1) <- c(dd[3],prod(dd[1:2]))
P1 <- t(P1)
if (verbose) cat("finding unique colours .../n")
P1u <- unique(P1)
rgbMat <- function(x) {
rgb(x[,1],x[,2],x[,3])
}
if (verbose) cat("creating colour index .../n")
pp <- paste(P1[,1],P1[,2],P1[,3],sep=".")
## make sure factor is correctly ordered
ind <- as.numeric(factor(pp,levels=unique(pp)))
if (verbose) cat("finding colour palette .../n")
if (nrow(P1u)>256) {
if (verbose) cat("kmeans clustering .../n")
kk <- kmeans(P1u,centers=256)
ind <- kk$cluster[ind]
pal <- rgbMat(kk$centers)
} else {
pal <- rgbMat(P1u)
}
## test:
if (debug) {
dev.new()
par(mar=rep(0,4))
image(t(matrix(ind-1,nrow=dd[1])),col=pal,axes=FALSE,ann=FALSE)
}
if (verbose) cat("writing GIF .../n")
indmat <- matrix(ind-1,nrow=dd[1])
storage.mode(indmat) <- "integer"
write.gif(indmat,fn,col=as.list(pal),scale="never")
}
X11.options(antialias="none")
image(matrix(1:64,nrow=8),col=rainbow(10))
saveGIF("tmp.gif",verbose=TRUE,debug=TRUE)
showGIF("tmp.gif")