数据中存在的因子级别/颜色,但使用scale_color_manual从图中丢失

时间:2015-02-20 18:40:34

标签: r ggplot2

这是一些虚拟数据:

dummy <- c(rep("castor", 20), rep("dandelion", 20), rep("goose", 20), rep("teapot", 20), rep("bee", 20), rep("fan" , 20))
groups <- c(rep(c(rep(1, 10), rep(2, 10)), 6))
mydata <- data.frame(a = rnorm(120, 0, 1), b = rnorm(120, 0, 1), dummy = dummy, groups = groups)

这是我编写的函数,用于绘制我从蓝色虚拟列中选择的级别。我希望剩余的水平以灰色绘制。那些剩余的因子级别(让我们称之为引用)现在是硬编码的,这不是问题,因为在我的实际数据中我有更多级别的选择(让我们称之为测试)来绘制,这就是我为此编写函数的原因。

custom_plot <- function(level){
   df <- subset(mydata, mydata$dummy == level | mydata$groups == "1")

   # Check that the test level is indeed in the subset df
   return(table(df$dummy, df$groups))              

   p <- ggplot(df, aes(x = a, y = b, color = dummy, shape = dummy)) + geom_point() + theme_bw()
   p <- p + scale_color_manual(values = c(level = "blue", "castor" = "gray", "dandelion" = "gray", "fan" = "gray", "goose" = "gray", "teapot" = "gray"))
   p
}

custom_plot("bee")

我无法发布图片,因为我需要至少10个声望,但基本上我得到的图表在图例中有测试级别,但图表中缺少实际的数据点,以及该级别的形状/颜色是空白的。我尝试使用中断,限制和标签参数但没有任何效果。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我相信这应该提供你想要的东西。如果您只是将颜色列表传递给ggplot,通常会容易得多。我冒昧地向您展示了一种索引颜色的方法,以便您选择的dummy级别是蓝色的。{/ p>

library(ggplot2)
custom_plot <- function(level){
  df <- subset(mydata, mydata$dummy == level | mydata$groups == "1")

  # create colors vector
  idx <- which(levels(mydata$dummy) == level)
  nlev <- nlevels(mydata$dummy)
  colors <- c(rep("gray", idx-1), "blue", rep("gray", nlev-idx))

  p <- ggplot(df, aes(x = a, y = b, color = dummy, shape = dummy)) + 
    geom_point() + 
    theme_bw()
  p <- p + scale_color_manual(values = colors)
  p
}

custom_plot("bee")