【问题标题】:add point and line layers with customized legends in ggplot2在 ggplot2 中添加带有自定义图例的点和线图层
【发布时间】:2014-10-05 16:26:52
【问题描述】:

我有一个关于使用ggplot2 在同一图中绘制点和线的问题。生成模拟数据的代码如下:

library(ggplot2)
set.seed(111)
x = seq(1,10,length=10)
y1 = rnorm(10, 0, 0.1)
y2 = rnorm(10, 5, 0.1)
y3 = rnorm(10, 10, 0.3)
y4 = rnorm(10, 20, 0.4)
label = c(rep("Cat",10), rep("Dog", 10), rep("Owl", 10), rep("Eagle", 10))
dat1 = data.frame(cbind(x, y=y1))
dat2 = data.frame(cbind(x, y=y2))
dat3 = data.frame(cbind(x, y=y3))
dat4 = data.frame(cbind(x, y=y4))
dat = data.frame(rbind(dat1, dat2, dat3, dat4))
dat = cbind(dat, label)
dat

我使用以下代码生成绘图:

ggplot(dat, aes(x=x, y=y, colour=label)) + 

  geom_line(data=dat[dat$label=="Cat", ], aes(x=x, y=y, linetype=label)) +
  geom_line(data=dat[dat$label=="Dog", ], aes(x=x, y=y, linetype=label)) +

  geom_point(data=dat[dat$label=="Owl", ], aes(x=x, y=y, colour=label)) + 
  geom_point(data=dat[dat$label=="Eagle", ], aes(x=x, y=y, colour=label)) + 

  scale_color_manual("Animal", 
                     values = c("Cat" = "darkgreen",
                                "Dog" = "blue", 
                                "Owl" = "red",
                                "Eagle" = "cyan")) + 
  theme_bw() +
  scale_linetype_manual(values=c(1,2)) +
  scale_alpha_manual(values=c(0.8, 0.8, 0.2, 0.2)) +
  scale_size_manual(values=c(1.8, 1.8, 0.6, 0.6)) +
  theme(legend.key=element_blank(),
        legend.key.width = unit(3, "line"),
        legend.key = element_blank())

当前的绘图输出如下所示:

需要更改以下几点以获得我想要的情节:

  1. 删除“标签”图例,仅显示“动物”图例
  2. 对于“Cat”和“Dog”图例,只显示点,不显示线;对于“猫头鹰”和 “鹰”图例,只显示线,不显示点
  3. 图例中的线型应与图中的线型相匹配
  4. 图例的顺序应该和我指定标签的顺序一样:猫、狗、猫头鹰和鹰
  5. 我希望线条更清晰(例如,宽度=2),并且点更透明(例如,alpha=0.4)
  6. 图例位置在情节内部,而不是外部

    感谢您的帮助/建议。谢谢!

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    由于您使用不同的颜色和线型,因此按您需要的顺序获取图例的最简单方法是使用函数 factor() 更改原始数据框中的级别顺序。

    dat$label<-factor(dat$label,levels=c("Cat","Dog","Owl","Eagle"))
    

    对于情节,我将只对geom_point()geom_line() 使用一次调用,并将ggplot()aes() 内的colour=linetype=shape= 设置为label。然后使用scale_color_manual() 设置您需要的颜色,然后使用scale_linetype_manual() 为猫和狗设置线型 1 和 2,为其他两个级别设置线型 0(不可见线)。在 scale_shape_manual() 内部,将 Cat 和 Dog 的值设置为 NA。在所有手动刻度中,使用相同的名称只能获得一个图例。 Alpha 和大小在 geom_point()geom_line() 内更改。图例位置使用函数theme() 的参数legend.postion= 调整。

    ggplot(dat, aes(x=x, y=y, colour=label,linetype=label,shape=label)) + 
          geom_point(alpha=0.4)+
          geom_line(size=2)+
          scale_color_manual("Animal", 
                             values = c("Cat" = "darkgreen",
                                        "Dog" = "blue", 
                                        "Owl" = "red",
                                        "Eagle" = "cyan"))    +
          scale_linetype_manual("Animal",values=c(1,2,0,0)) +
          scale_shape_manual("Animal",values=c(NA,NA,16,16))+
          theme_bw()+
          theme(legend.position=c(0.85,0.80))
    

    【讨论】:

    • 非常感谢!这正是我想要的:)
    • 抱歉,我还有一个问题:有没有办法隐藏“Eagle”的图例?我只想显示其他三个变量的图例,但在图中,应该显示所有四个变量。谢谢!
    • 将参数 breaks=c("Cat","Dog","Owl") 添加到所有三个 scale_... 函数
    • 如果不是点,比如 geom_segment 或 geom_polygon 怎么办?
    猜你喜欢
    • 2020-11-15
    • 2016-10-05
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 2016-08-10
    相关资源
    最近更新 更多