ggplot2 0.9.0自动从绘图图例中删除未使用的因子水平?

N. *_*kar 35 r ggplot2

我最近从版本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) 
Run Code Online (Sandbox Code Playgroud)

qplot()曾经在传奇中给我"苹果"和"橙色"(尽管只有"苹果"的分数).现在我只在传说中得到"苹果".

这个原因出现了 - 我正在制作许多数据集的子集,我希望这些图例标准化(通常我会欣赏未使用的级别被自动删除而不必输入droplevels(),但这是一个我希望那些未使用的水平).如果这只是我的电脑本地问题,请道歉.

jor*_*ran 43

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

ggplot(subset(df,fruit == "apple"),aes(x = year,y = qty,colour = fruit)) + 
    geom_point() + 
    scale_colour_discrete(drop = FALSE)
Run Code Online (Sandbox Code Playgroud)


Axe*_*man 5

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

ggplot(subset(df,fruit == "apple"),aes(x = year,y = qty,colour = fruit)) + 
    geom_point() + 
    scale_colour_discrete(limits = c("apple", "orange"))
Run Code Online (Sandbox Code Playgroud)

  • 由于某些原因,此方法适用于scale_color_manual(),而drop = FALSE则没有 (3认同)
  • 为了回答 @zer0hedge 四年前的问题, drop = FALSE 特定于因子水平的保留。因此,如果填充美观不是一个因素(例如,它是重复某些字符串或特定整数值的向量),则设置 drop = FALSE 无效。相反,有必要列出所有这些“级别”作为限制(从 ggplot 3.3.5 开始)。 (3认同)