29 votes

Erreur bizarre de ggplot2 : Raster vide

Pourquoi est-ce que

ggplot(data.frame(x=c(1,2),y=c(1,2),z=c(1.5,1.5)),aes(x=x,y=y,color=z)) +
geom_point()

Donnez-moi l'erreur

Erreur dans grid.Call.graphics(L_raster, x$raster, x$x, x$y, x$width, x$height, : Empty raster

mais les deux tracés suivants fonctionnent

ggplot(data.frame(x=c(1,2),y=c(1,2),z=c(2.5,2.5)),aes(x=x,y=y,color=z)) +
geom_point()
ggplot(data.frame(x=c(1,2),y=c(1,2),z=c(1.5,2.5)),aes(x=x,y=y,color=z)) +
geom_point()

J'utilise ggplot2 0.9.3.1.

4voto

Le même comportement (c'est-à-dire l'erreur "Empty raster") m'est apparu avec une autre valeur que 1.5.

Essayez ce qui suit :

ggplot(data.frame(x=c(1,2),y=c(1,2),z=c(0.02,0.02)),aes(x=x,y=y,color=z))
+ geom_point()

Et vous obtenez à nouveau la même erreur (essayée avec les deux versions 0.9.3.1 et 1.0.0.0), il s'agit donc d'un bug méchant et bizarre.

0voto

ideamotor Points 362

Cela ressemble définitivement à un cas limite qui conviendrait mieux à un rapport de bogue comme d'autres l'ont mentionné, mais voici un code généralisable qui pourrait être utile à quelqu'un comme solution de contournement ou pour gérer les étiquettes/couleurs. Il s'agit de tracer une variable redimensionnée et d'utiliser les valeurs réelles comme étiquettes.

require(scales)
z <- c(1.5,1.5)
# rescale z to 0:1
z_rescaled <- rescale(z)
# customizable number of breaks in the legend
max_breaks_cnt <- 5
# break z and z_rescaled by quantiles determined by number of maximum breaks 
#  and use 'unique' to remove duplicate breaks
breaks_z <- unique(as.vector(quantile(z, seq(0,1,by=1/max_breaks_cnt))))
breaks_z_rescaled <- unique(as.vector(quantile(z_rescaled, seq(0,1,by=1/max_breaks_cnt))))
# make a color palette
Pal <- colorRampPalette(c('yellow','orange','red'))(500)
# plot z_rescaled with breaks_z used as labels
ggplot(data.frame(x=c(1,2),y=c(1,2),z_rescaled),aes(x=x,y=y,color=z_rescaled)) +
  geom_point() + scale_colour_gradientn("z",colours=Pal,labels = breaks_z,breaks=breaks_z_rescaled)

C'est tout à fait hors sujet mais j'aime utiliser le redimensionnement pour envoyer des tonnes de variables changeantes à une fonction comme celle-ci :

colorfunction <- gradient_n_pal(colours = colorRampPalette(c('yellow','orange','red'))(500),
                            values = c(0:1), space = "Lab")
colorfunction(z_rescaled)

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