如何添加图例以使用来自多个数据框的数据进行绘制

时间:2019-11-10 13:33:12

标签: r ggplot2 legend

我编写了一个由两个单独的数据帧编译而成的ggplot脚本,但就目前而言,由于aes中不包含颜色,因此没有图例。如果可能,我宁愿将两个数据集分开,但无法弄清楚如何添加图例。有什么想法吗?

我尝试过将颜色直接添加到es函数中,但是然后颜色只是作为变量添加并在图例中列出,而不是对实际数据进行着色。

在创建绘图后,用基数r对此进行绘图:

legend("top",c("Delta 18O","Delta 13C"),fill=c("red","blue")

得到了我所需要的,但是我不确定如何在ggplot中复制它。

下面的代码当前正好绘制了我想要的内容,只是缺少了图例...理想情况下,该图应该与上面的代码行匹配,除了“ 18”和“ 13”需要上标。

使用基数r(具有正确的图例,但没有上标13和18的情况下)的旧图的示例,以及缺少图例的当前图的示例可在此处找到: 旧版:https://imgur.com/xgd9e9C 新的缺少的图例:https://imgur.com/eGRhUzf

背景数据

head(avar.data.x)
      time          av       error
1 1.015223 0.030233604 0.003726832
2 2.030445 0.014819145 0.005270609
3 3.045668 0.010054801 0.006455241
4 4.060891 0.007477541 0.007453974
5 5.076113 0.006178282 0.008333912
6 6.091336 0.004949045 0.009129470
head(avar.data.y)
      time         av       error
1 1.015223 0.06810001 0.003726832
2 2.030445 0.03408136 0.005270609
3 3.045668 0.02313839 0.006455241
4 4.060891 0.01737148 0.007453974
5 5.076113 0.01405144 0.008333912
6 6.091336 0.01172788 0.009129470

以下avarn函数产生一个具有三列和数千行的数据帧(请参见上面的标题)。然后将它们随时间绘制在对数/对数图上。

avar.data.x <- avarn(data3$"d Intl. Std:d 13C VPDB - Value",frequency)

avar.data.y <- avarn(data3$"d Intl. Std:d 18O VPDB-CO2 - Value",frequency)

创建Allan偏差图

ggplot()+
      geom_line(data=avar.data.y,aes(x=time,y=sqrt(av)),color="red")+
      geom_line(data=avar.data.x,aes(x=time,y=sqrt(av)),color="blue")+
      scale_x_log10()+
      scale_y_log10()+
      labs(x=expression(paste("Averaging Time ",tau," (seconds)")),y="Allan Deviation (per mil)")

上面的图仅缺少图例以显示两个绘制的数据集的名称及其各自的颜色。我想在图的顶部居中显示图例。

如何为图例标题加上上标?:

ggplot()+
  geom_line(data=avar.data.y,aes(x=time,y=sqrt(av), 
color =expression(paste("Delta ",18^,"O"))))+
  geom_line(data=avar.data.xmod,aes(x=time,y=sqrt(av), 
color=expression(paste("Delta ",13^,"C"))))+
  scale_color_manual(values = c("blue", "red"),name=NULL) +
  scale_x_log10()+
  scale_y_log10()+
  labs(
    x=expression(paste("Averaging Time ",tau," (seconds)")),
    y="Allan Deviation (per mil)") + 
  theme(legend.position = c(0.5, 0.9))

2 个答案:

答案 0 :(得分:2)

color内设置aes并在绘图中添加scale_color_函数即可解决问题。

ggplot()+
  geom_line(data=avar.data.y,aes(x=time,y=sqrt(av), color = "a"))+
  geom_line(data=avar.data.x,aes(x=time,y=sqrt(av), color="b"))+
  scale_color_manual(
    values = c("red", "blue"),
    labels = expression(avar.data.x^2, "b")
  ) +
  scale_x_log10()+
  scale_y_log10()+
  labs(
    x=expression(paste("Averaging^2 Time ",tau," (seconds)")),
    y="Allan Deviation (per mil)") + 
  theme(legend.position = c(0.5, 0.9))

答案 1 :(得分:2)

@ z-cool值得接受。 但是,当前的方法并未使用ggplots惊人的美学。您的数据帧似乎都具有相同的结构。现在,请记住,一种更类似于ggplot的方式将是制作一个单个长数据帧并使用color(或任何美学方法),如下所示:

avar.data.x <- readr::read_table("0 time          av       error
1 1.015223 0.030233604 0.003726832
2 2.030445 0.014819145 0.005270609
3 3.045668 0.010054801 0.006455241
4 4.060891 0.007477541 0.007453974
5 5.076113 0.006178282 0.008333912
6 6.091336 0.004949045 0.009129470") 
avar.data.y <- readr::read_table("0 time         av       error
1 1.015223 0.06810001 0.003726832
2 2.030445 0.03408136 0.005270609
3 3.045668 0.02313839 0.006455241
4 4.060891 0.01737148 0.007453974
5 5.076113 0.01405144 0.008333912
6 6.091336 0.01172788 0.009129470")

library(tidyverse)

combine_df <- bind_rows(list(a = avar.data.x, b = avar.data.y), .id = 'ID')

ggplot(combine_df)+
  geom_line(aes(x = time, y = sqrt(av), color = ID))+
  scale_color_manual(values = c("red", "blue"),
    labels = c(expression("Delta 18"^"O"), expression("Delta 13"^"C"))) 

reprex package(v0.2.1)于2019-11-11创建

这仅给geom_line打电话,并且更轻松,更好地控制图例。您甚至可以制作一些精美的功能来自动执行标签。等等

还要注意,列名中的空格不太好(您的生活非常困难),并且您可能需要考虑自动执行avarn调用,例如与lapply一起使用,这将产生数据帧列表,并使数据帧的绑定更加容易。