Как добавить легенду на график с данными из нескольких фреймов данных - PullRequest
0 голосов
/ 10 ноября 2019

Я написал сценарий ggplot, скомпилированного из двух отдельных фреймов данных, но в его нынешнем виде легенды нет, поскольку цвета не включены в aes. Я бы предпочел разделить два набора данных, если это возможно, но не могу понять, как добавить легенду. Есть мысли?

Я пытался добавить цвета непосредственно в функцию AES, но затем цвета просто добавляются как переменные и отображаются в легенде, а не окрашивают фактические данные.

Построение этого с помощью базы 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)

Создание графика отклонения Аллана

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 ]

1 голос
/ 11 ноября 2019

@ 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"))) 

Создано в 2019-11-11 пакетом представ. (v0.2.1)

Это дает только один вызов geom_line, что упрощает и улучшает контрольлегенды). Вы даже можете сделать какую-нибудь необычную функцию для автоматизации ваших ярлыков. и т. д.

Также обратите внимание, что пробелы в именах столбцов невелики (вы делаете свою собственную жизнь очень сложной) и что вы можете подумать об автоматизации ваших вызовов avarn, например, с помощью lapply, что приведет к созданию списка фреймов данных и сделает привязку фреймов данных еще проще.

1 голос
/ 10 ноября 2019

Установите 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))
...