当填充值全为NA时ggplot2错误:seq.default中的错误(h [1],h [2],length.out = n):

时间:2017-08-25 02:14:08

标签: r ggplot2

我有一个通用的plot_data(data)方法。有时传入数据包含我用于 fill 的变量的所有NA,这会导致错误

Error in seq.default(h[1], h[2], length.out = n) : 
  'to' must be a finite number

例如:

df <- data.frame(
  x = c(1, 2, 3, 4), 
  y = c(10, 15, 20, 25),
  foo = factor(c(NA, NA, NA, "yes"), levels=c("yes", "no"))
)

ggplot(df, aes(x=x, y=y, fill=foo))+geom_bar(stat = "identity")  # works
ggplot(df[1:3, ], aes(x=x, y=y, fill=foo))+geom_bar(stat = "identity")  # error

我不明白为什么情节2不应该渲染(只有所有灰色条)。有没有一种简单的方法可以解决这个问题?

3 个答案:

答案 0 :(得分:2)

您可以使用fct_explicit_na包中的forcats将缺失值设为显式因子级别。 (请注意,基本软件包中的addNA在这里不起作用;后者将NA添加为级别,但不会导致它显示在图中。)

ggplot(df[1:3, ], 
       aes(x=x, y=y, fill=forcats::fct_explicit_na(foo)))+
  geom_bar(stat = "identity")

除此之外:如果你有其他价值观和只想为NA版本使用不同的默认颜色,您可以更改scale_fill_discrete(na.value = "some colour other than grey")

中的选项

答案 1 :(得分:1)

有点难过......

ggplot(df[1:3,], aes(x=x, y=y, if(!all(is.na(foo))){fill=foo})) +
  geom_bar(stat = "identity")

答案 2 :(得分:0)

灰色表示没有填充。例如,下面的代码将给出灰色图:

ggplot(df, aes(x=x, y=y))+geom_bar(stat = "identity") 在您的示例中,当包含foo = "yes"的行时,foo = NA的行实际上没有填充颜色,只填充了最后一行。但是,当排除最后一行时,列foo中的所有值都变为NA。如错误所示,填充映射中to的结尾必须是有限数,而不是NA。避免这种情况的一种方法是将NA转换为字符串,例如:

ggplot(df[1:3, ], aes(x=x, y=y, fill=ifelse(is.na(foo), "NA", foo)))+geom_bar(stat = "identity")