在ggplot2中添加带有自定义图例的点和线图层

时间:2014-10-04 19:57:06

标签: r ggplot2

我有一个问题是使用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())

当前的绘图输出如下所示: enter image description here

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

  1. 删除“标签”图例,仅显示“动物”图例
  2. 表示“猫”和“狗”的传说,只显示点数,而不是线条;为“猫头鹰”和 “鹰”传奇,只显示线条,而不是点数
  3. 图例中的线条类型应与图中的线条类型匹配
  4. 图例的顺序应与我指定标签的顺序相同:猫,狗,猫头鹰和鹰
  5. 我希望这些行是自动收报机(例如,宽度= 2),并且这些点更透明(例如,alpha = 0.4)
  6. 图例位置在图中,而不在

    之外

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

1 个答案:

答案 0 :(得分:2)

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

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

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

theme()

enter image description here