Добавление заголовка и другой строки в линейный график с помощью ggplot2 - PullRequest
1 голос
/ 16 апреля 2020

Я получил помощь от другого пользователя о том, как создавать эти графики (спасибо!):

test <- data.frame("Site_No" = c("01370", "01332", "01442"),"0.99" = c(12, 15, 18), "0.98" = c(14, 
15, 18), "0.90" = c(7, 22, 30), ".80" = c(3,2,1), ".75" = c(1, 6, 8), ".70" = c(5,6,9), ".60" = c(15,6,19), ".50" = c(5,6,9), ".40" = c(9,16,20), ".30" = c(1, 15, 3), ".25" = c(5,16,19), ".20" = c(5,1,20), ".10" = c(11,12,13), ".05" = c(15,16,28), "0.02" = c(22,20,12), ".01" = c(3,26,29))

dt <- as.data.table(test)

melted <- data.table::melt(dt, measure = c("X0.99","X0.98","X0.90"))

for (i in unique(melted$Site_No)){
    dev.new()
    print(ggplot2::ggplot(data = melted[Site_No == i,], mapping = aes(x = variable, y = value, group 
    = Site_No)) +
    ggplot2::geom_line())
} 

У меня просто есть несколько вопросов для некоторых дополнений

1) Я хотел бы добавить заголовок к каждому из этих графиков с помощью Site_No. Я попытался добавить title = Site_no к коду, но это не сработало.

2) Я хотел бы добавить в этот график еще одну строку, содержащую эти данные (другой цвет, чем в другой строке):

test2 <- data.frame("Site_No" = c("01370", "01332", "01442"),"0.99" = c(19, 36, 22), "0.98" = c(19, 
10, 28), "0.90" = c(2, 6, 8))

Я попытался скопировать тот же код, чтобы добавить другую строку, но это не сработало.

3) Я хотел бы сохранить каждый из этих 3 графиков в моем локальном каталоге автоматически. Поэтому мне не нужно делать это индивидуально для каждого сюжета (на самом деле я использую 100 сюжетов, а не 3).

Большое вам спасибо за помощь:)

1 Ответ

1 голос
/ 16 апреля 2020

Для вашего вопроса 1), чтобы добавить заголовок, вы можете использовать ggtitle в своей функции.

Для вопроса 2) возможное решение состоит в том, чтобы связать оба ваших фрейма данных.

library(data.table)
melted2 <- melt(setDT(test2), measure = c("X0.99","X0.98","X0.90"))

library(dplyr)
DF <- left_join(melted, melted2, by = c("Site_No","variable")) 

DF <- melt(setDT(DF), measure = c("value.x","value.y"), variable.name = "Test",value.name = "Value")

    Site_No variable    Test Value
 1:   01370    X0.99 value.x    12
 2:   01332    X0.99 value.x    15
 3:   01442    X0.99 value.x    18
 4:   01370    X0.98 value.x    14
 5:   01332    X0.98 value.x    15
 6:   01442    X0.98 value.x    18
 7:   01370    X0.90 value.x     7
 8:   01332    X0.90 value.x    22
 9:   01442    X0.90 value.x    30
10:   01370    X0.99 value.y    19
11:   01332    X0.99 value.y    36
12:   01442    X0.99 value.y    22
13:   01370    X0.98 value.y    19
14:   01332    X0.98 value.y    10
15:   01442    X0.98 value.y    28
16:   01370    X0.90 value.y     2
17:   01332    X0.90 value.y     6
18:   01442    X0.90 value.y     8

Затем, чтобы добавить вторую строку на график, вы можете изменить group в aes и добавьте аргумент color.

Итак, ваша функция должна выглядеть следующим образом:

for (i in unique(DF$Site_No)){
  dev.new()
  print(ggplot2::ggplot(data = DF[Site_No == i,], mapping = aes(x = variable, y = Value, group 
                                                                    = Test)) +
          ggplot2::geom_line(aes(color = Test)) +
          ggplot2::scale_color_discrete(labels = c("test1","test2"))+
          ggplot2::ggtitle(paste("Title:", i)))
} 

Для вашего вопроса 3), вы можете использовать ggsave, чтобы напрямую сохранить график в ваш текущий каталог.

library(ggplot2)

for (i in unique(DF$Site_No)){
  graph <- ggplot(data = DF[Site_No == i,], mapping = aes(x = variable, y = Value, group 
                                               = Test)) +
  geom_line(aes(color = Test)) +
  scale_color_discrete(labels = c("test1","test2"))+
  ggtitle(paste("Title:", i))

  ggsave(filename = paste0("Site_",i,".png"), plot = graph, device = "png", width  = 5, height = 5, units = "in")
}

вот пример сохраненного графика: enter image description here


РЕДАКТИРОВАТЬ: с дополнительными значениями x: непрерывный или дискретный график

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

Один из способов - сохранить эти значения дискретными и просто уменьшить размер текста по оси x в theme.

Здесь подготовка данных, основанная на вашем новом примере:

library(data.table)

melted <-  melt(setDT(test), measure = list(grep("X",colnames(test))))
melted2 <- melt(setDT(test2), measure = list(grep("X",colnames(test2))))

DF <- left_join(melted, melted2, by = c("Site_No","variable")) 
DF <- melt(setDT(DF), measure = c("value.x","value.y"), variable.name = "Test",value.name = "Value")
DF$variable <- gsub("X\\.","X0\\.",DF$variable)

Для графика вы можете получить:

for (i in unique(DF$Site_No)){
  graph <- ggplot(data = DF[Site_No == i,], mapping = aes(x = variable, y = Value, group 
                                                          = Test)) +
    geom_line(aes(color = Test)) +
    scale_color_discrete(labels = c("test1","test2"))+
    ggtitle(paste("Title:", i))+
    theme(axis.text.x = element_text(angle = 90, size = 10, vjust = 0.5))

  ggsave(filename = paste0("Site_",i,".png"), plot = graph, device = "png", width  = 5, height = 5, units = "in")

}

, что дает вам следующий график: enter image description here

Другая возможность чтобы представить ваши данные в непрерывном масштабе и расположить надписи так, чтобы текст показывался чуть меньше:

DF2 <- DF %>% mutate(variable = as.numeric(gsub("X","",variable)))
setDT(DF2)
for (i in unique(DF2$Site_No)){
  graph <- ggplot(data = DF2[Site_No == i,], mapping = aes(x = variable, y = Value, group 
                                                          = Test)) +
    geom_line(aes(color = Test)) +
    scale_color_discrete(labels = c("test1","test2"))+
    scale_x_continuous(breaks = seq(0,1,by = 0.1))+
    ggtitle(paste("Title:", i))

  ggsave(filename = paste0("Site_",i,"_conti_.png"), plot = graph, device = "png", width  = 5, height = 5, units = "in")
}

, который дает такой вид графика: enter image description here

Наконец, третья возможность - добавить шкалу к ggsave:

for (i in unique(DF$Site_No)){
  graph <- ggplot(data = DF[Site_No == i,], mapping = aes(x = variable, y = Value, group 
                                                          = Test)) +
    geom_line(aes(color = Test)) +
    scale_color_discrete(labels = c("test1","test2"))+
    ggtitle(paste("Title:", i))

  ggsave(filename = paste0("Site_",i,".png"), plot = graph, device = "png", width  = 5, height = 5, units = "in", scale = 2)  
}

enter image description here

Вы также можете смешать эти решения и получить некоторая непрерывная шкала с вращающейся маркировкой для примера. Вам решать.

Это отвечает на ваш вопрос?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...