2017-08-25 1623 views
1

我有一个通用的plot_data(data)方法。有时,输入的数据有我用填写变量所有NAS,这将导致错误ggplot2错误,当填充值都是NA:seq.default(h [1],h [2],length.out = n)中的错误:

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(只有全部灰色条)。有没有简单的方法来克服这一点?

回答

1

的难吃类...

ggplot(df[1:3,], aes(x=x, y=y, if(!all(is.na(foo))){fill=foo})) + 
    geom_bar(stat = "identity") 
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")

2

您可以使用fct_explicit_naforcats包,使缺失值一个明确的因子水平。 (注意:addNA从基础包不会在这里工作;后者增加了NA的水平,但不会导致它在图中显示。)

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

旁白:如果你有其他的值&只需要不同的默认颜色,您可以更改scale_fill_discrete(na.value = "some colour other than grey")的选项