【问题标题】:change color for two geom_point() in ggplot2改变ggplot2中两个geom_point()的颜色
【发布时间】:2013-11-04 22:36:10
【问题描述】:

样本数据集:

library(ggplot2)    
df = read.table(text = 
              "id      year    value1  value2 value3
            1           2000    1   2000      2001
            1           2001    2   NA        NA
            1           2002    2   2000      NA
            1           2003    2   NA         2003
            2           2000    1   2001     2003
            2           2002    2   NA       2000
            2           2003    3   2002     NA
            3           2002    2   2001     NA
        ", sep = "", header = TRUE)
df$value1 <- as.factor(df$value1)

我知道如何更改具有三个级别的因子变量的颜色:

p <- ggplot(df, aes(y=id))
p <- p + scale_colour_manual(name="",  values =c("yellow", "orange", "red"))
p <- p + geom_point(aes(x=year, color=value1), size=4)
p

我还可以更改两个数值变量的颜色:

p <- ggplot(df, aes(y=id))
p <- p + scale_colour_manual(name="",  values =c("value3"="grey", "value2"="black"))
p <- p + geom_point(aes(x=value3, colour ='value3'), size=3)
p <- p + geom_point(aes(x=value2, colour ='value2'), size=5)
p

但我不知道如何在同一张图中更改两者的颜色? 它也适用于 scale_color_manual 吗?

p <- last_plot() + geom_point(aes(x=year, color=value1))
p

【问题讨论】:

  • 您可以使用 reshape 包将列融合在一起吗?这似乎很接近但不正确... require(reshape) melt(df,id.vars = c("id","year"), measure.vars=c("value1","value2")) df$value
  • 可能,但我正在寻找一种也适用于两个以上 geom_points() 并且最好直接在 ggplot2 中的解决方案。我认为 ggplot2 中存在一个简单的方法,但我仍在拼命寻找它..

标签: r ggplot2


【解决方案1】:

这是你要找的吗?

ggplot(df, aes(y=id)) +
  geom_point(aes(x=year, color=value1), size=4) +
  geom_point(aes(x=value3, colour ='value3'), size=3) +
  geom_point(aes(x=value2, colour ='value2'), size=5) +
  scale_colour_manual(name="",  
                      values = c("1"="yellow", "2"="orange", "3"="red",
                                 "value3"="grey", "value2"="black"))

基本上,只是将所有可能的颜色标签放在一个列表中。

【讨论】:

  • @mad 你能不能把geom_point换成geom_jitter
【解决方案2】:

JLLagrange 的想法是正确的。在绘图之前使用reshape2 中的melt 将数据转换为长格式。

df_long <- melt(df,id.vars = c("id", "year"), measure.vars=c("value2", "value3"))
(p <- ggplot(df_long, aes(y = id)) + 
  scale_colour_manual(name = "", values = c(value3 = "grey", value2 = "black")) +
  scale_size_manual(name = "", values = c(value3 = 3, value2 = 5)) +
  geom_point(aes(x = value, colour = variable, size = variable))
)

根据您的评论,您的数据应该采用不同的形式。本质上,您认为value2value3year 相同,但value1 具有额外的级别。像这样重构你的数据:

df1 <- df[, c("id", "year", "value1")]

df2 <- data.frame(
  id     = df$id,
  year   = df$value2,
  value1 = "4"
)

df3 <- data.frame(
  id     = df$id,
  year   = df$value3,
  value1 = "5"
)

df_all <- rbind(df1, df2, df3)
df_all$value1 <- factor(df_all$value1)

然后你可以用这个画一个情节:

(p <- ggplot(df_all, aes(id, year, colour = value1)) + 
  geom_point(
    size = 3, 
    position = position_jitter(height = 0, width = 0.05)
  ) +
  scale_colour_manual(
    values = c("1" = "yellow", "2" = "orange", "3" = "red", "4" = "grey", "5" = "black")
  )
)

(我为这些点添加了一些抖动,以便您可以看到它们重叠的位置。您还可以在geom_point 中设置alpha 值。)

【讨论】:

  • 我不明白。您的示例只是为我提供了灰色和黑色的 value2 和 value3 的图,但它不包括 value1,是吗?
  • @Jules 您的问题看起来好像您想更改第二个图中 value2 和 value3 的颜色。您尚未绘制包含所有三个值的图。如果我的解决方案不是您想要的,请澄清问题。
  • :基本上在第一步中,我想将 value1 的颜色更改为黄色、橙色和红色(或连续色标,如果我有 3 个以上的级别,也会使其更灵活)。在第二步中,我想将 value2 和 value3(灰色和黑色)添加到第一步创建的图表中,因此我最终得到一个包含所有三个值的图表。
猜你喜欢
  • 2013-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-23
  • 1970-01-01
相关资源
最近更新 更多