我有一个通用的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不应该渲染(只有所有灰色条)。有没有一种简单的方法可以解决这个问题?
答案 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")