Weird ggplot2 error: пустой растровый
Почему
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()
введите ошибку
Ошибка в grid.Call.graphics(L_raster, x $растер, x $x, x $y, x $width, x $height,: Пустой растровый
но следующие два графика работают
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()
Я использую ggplot2 0.9.3.1
Ответы
Ответ 1
TL; DR: проверьте свои данные - действительно ли вы хотите использовать непрерывную цветовую шкалу только с одним возможным значением для цвета?
Ошибка, если вы добавили + scale_fill_continuous(guide=FALSE)
в график. (Это отключает легенду.)
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() + scale_color_continuous(guide = FALSE)
Ошибка, кажется, срабатывает в случаях, когда непрерывная цветовая шкала использует только один цвет. Текущая версия GitHub уже содержит релевантный запрос на перенос. Установите его через:
devtools::install_github("hadley/ggplot2")
Но, скорее всего, проблема связана с данными: почему вы используете непрерывную цветовую шкалу только с одним значением?
Ответ 2
То же поведение (то есть ошибка "пустой растровый" ) мне показалось с другим значением, отличным от 1.5.
Попробуйте следующее:
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()
И вы снова получите ту же ошибку (попробовали с версиями 0.9.3.1 и 1.0.0.0), поэтому она выглядит как неприятная и странная ошибка.
Ответ 3
Это определенно похоже на край, более подходящий для отчета об ошибке, как упоминали другие, но здесь есть какой-то обобщаемый код, который может быть полезен кому-то как неуклюжий обходной путь или для обработки ярлыков/цветов. Он отображает измененную переменную и использует реальные значения в качестве меток.
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)
Это совсем не по теме, но мне нравится использовать масштабирование, чтобы отправить тонны переменных переменных в функцию, подобную этой:
colorfunction <- gradient_n_pal(colours = colorRampPalette(c('yellow','orange','red'))(500),
values = c(0:1), space = "Lab")
colorfunction(z_rescaled)