ggplot генерирует две легенды, когда нужна только одна

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

В конечном итоге я хочу создать единую легенду, чтобы изменения стиля и маркировки вступили в силу.

library(ggplot2)
temp_df <- data.frame(year = integer(50), value = numeric(50), case = character(50))
temp_df$year <- 1:50
temp_df$value <- runif(50)
temp_df$case <- "A"
df <- temp_df
temp_df$value <- runif(50)
temp_df$case <- "B"
df <- rbind(df, temp_df)
LineTypes <- c("solid", "dotted")
colors <- c("red", "black")
linealphas <- c(1, .8)
linesizes <- c(1, 2)
Plot <- ggplot(df, aes(x = year, y = value, group = case))+
  geom_line(aes(linetype = case, color = case, size = case, alpha = case))+
  scale_linetype_manual(values = LineTypes)+
  scale_color_manual(values = colors)+
  scale_y_continuous(limits = c(0, 1), labels = scales::percent)+
  scale_alpha_manual(values = linealphas)+
  scale_size_manual(values = linesizes)+
  xlab("Year")+
  ylab("Percentage%")+
  labs(color = "Scenario")+
  theme_minimal()
Plot

Результат текущего кода


person vcelloho    schedule 08.05.2018    source источник
comment
Вы можете использовать аргумент name = внутри функций ручного масштабирования_*, чтобы изменить заголовок легенды, и например, + guides(linetype = FALSE), чтобы скрыть легенду, связанную с функцией масштабирования_*. Но лично я бы в этом случае использовал только цвет для различения групп.   -  person neilfws    schedule 09.05.2018


Ответы (3)


Коллега указал мне на решение: ключом было удалить направляющие, чтобы для легенды использовался только один из стилей, которые я определил.

     guides(size = FALSE)+
     guides(alpha = FALSE)+
     guides(linetype = FALSE)+ 

Его объяснение этого состояло в том, что R не признает, что вектор факторов, определяющих свойства графика, обязательно связан. В результате он будет генерировать несколько легенд, когда требуется только одна.

    library(ggplot2)
    temp_df<-data.frame(year=integer(50),value=numeric(50),case=character(50))
    temp_df$year<-1:50
    temp_df$value<-runif(50)
    temp_df$case<-"A"
    df<-temp_df
    temp_df$value<-runif(50)
    temp_df$case<-"B"
    df<-rbind(df,temp_df)
    LineTypes<-c("solid","dotted")
    colors<-c("red","black")
    linealphas<-c(1,.8)
    linesizes<-c(1,2)
    Plot<-ggplot(df,aes(x=year,y=value,group=case))+
      geom_line(aes(linetype=case, color=case, size=case, alpha =case))+
      scale_linetype_manual(values=LineTypes)+
      scale_color_manual(values=colors)+
      scale_y_continuous(limits=c(0,1),labels = scales::percent)+
      scale_alpha_manual(values=linealphas)+
      scale_size_manual(values=linesizes)+
      xlab("Year")+
      ylab("Percentage%")+
      labs(color = "Scenario")+
      guides(size = FALSE)+
      guides(alpha = FALSE)+
      guides(linetype = FALSE)+
      theme_minimal()
    Plot

введите здесь описание изображения

person vcelloho    schedule 08.05.2018
comment
Но тогда ключ легенды (linetype) для сценария B не совсем корректен, не так ли? См. этот ответ для исправления - person Tung; 09.05.2018

Разве вы не можете просто удалить строку «лаборатории (цвет = «Сценарий»)»? Это сюжет, который генерируется. Не уверен, что в нем отсутствует что-то, что вам нужно.

Результат мне кажется хорошим: (мне кажется хорошим)

person Zheng Yan    schedule 08.05.2018
comment
Две вещи, я хочу изменить название легенды. Да, технически я мог бы просто дать рассматриваемому столбцу другое имя, но я бы предпочел сделать это на этапе построения графика. Также изменения стиля в сюжете не распространяются на обе легенды. - person vcelloho; 09.05.2018
comment
Конечно, это обходной путь. Однако я не знаю, почему мы не можем изменить заголовок легенды в этом примере. я пробовал безуспешно - person lcgodoy; 09.05.2018

Если вы хотите, чтобы ggplot объединил легенды, все они должны иметь одинаковый заголовок. Вы можете указать заголовок легенды с аргументом name в весах:

ggplot(df, aes(x = year, y = value, group = case))+
  geom_line(aes(linetype = case, color = case, size = case, alpha = case)) +
  scale_linetype_manual(values = LineTypes, name = "Scenario")+
  scale_color_manual(values = colors, name = "Scenario")+
  scale_y_continuous(limits = c(0, 1), labels = scales::percent)+
  scale_alpha_manual(values = linealphas, name = "Scenario")+
  scale_size_manual(values = linesizes, name = "Scenario")+
  xlab("Year")+
  ylab("Percentage%")+
  theme_minimal()

введите здесь описание изображения

person Claus Wilke    schedule 09.05.2018