40

我最近从 0.8.9 版本升级到 ggplot2 0.9.0,现在我知道我的情节图例只显示情节中使用的因子水平(它省略了未使用的因子水平)。在它包含图例中的所有因子水平之前。我正在运行 Windows 7 和 R 2.15.0(今天之前的 2.14.2)。

其他人也发现这个吗?有没有办法让未使用的因子水平显示在我的情节图例中?

library(ggplot2)

df <- data.frame(fruit = rep(c("apple", "orange"), times=11), 
                 year = 1990:2011, 
                 qty = rnorm(22, 100, 20))

# This plot only gives "apple" in the legend now.
# Before, I used to get both "apple" and "orange". 
qplot(year, qty, data = subset(df, fruit=="apple"), colour = fruit) 

qplot() 在传说中曾经给我“苹果”和“橙色”(即使只有“苹果”的点)。现在我只在传说中得到“苹果”。

出现这种情况的原因 - 我正在制作许多数据集子集的图,我希望图例跨图标准化(通常我会欣赏未使用的级别被自动删除而不必键入 droplevels(),但这是一个情况下我想要那些未使用的级别)。如果这只是我的计算机本地的问题,我们深表歉意。


编辑:请注意,从 R 4.0.0 开始,上述代码不再产生 adf$fruit作为因素,这会改变ggplot下面问题和答案中的行为。重现使用:

df <- data.frame(
  fruit = factor(rep(c("apple", "orange"), times=11)), 
  year = 1990:2011, 
  qty = rnorm(22, 100, 20)
)
4

2 回答 2

50

是的,您想添加drop = FALSE到您的色标:

ggplot(subset(df,fruit == "apple"),aes(x = year,y = qty,colour = fruit)) + 
    geom_point() + 
    scale_colour_discrete(drop = FALSE)
于 2012-04-03T23:04:55.320 回答
11

第二种方法是使用limits参数显式定义所需的条目:

ggplot(subset(df,fruit == "apple"),aes(x = year,y = qty,colour = fruit)) + 
    geom_point() + 
    scale_colour_discrete(limits = c("apple", "orange"))
于 2017-08-18T21:23:22.093 回答