Подтвердить что ты не робот

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

4b9b3361

Ответ 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)