【问题标题】:ggplot generating two legends when only one is wanted当只需要一个图例时,ggplot会生成两个图例
【发布时间】:2018-10-18 23:27:59
【问题描述】:

在 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

【问题讨论】:

  • 您可以在手动 scale_* 函数中使用 name = 参数来更改图例标题,eg + guides(linetype = FALSE) 可以隐藏与 scale_* 函数关联的图例.但就个人而言,在这种情况下,我只会使用颜色来区分组。

标签: r plot ggplot2 legend labeling


【解决方案1】:

如果您希望 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()

【讨论】:

    【解决方案2】:

    一位同事向我指出了一个解决方案,关键是删除指南,以便只有我定义的一种样式用于图例。

         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
    

    【讨论】:

    • 但是场景B 的图例键(linetype)并不完全正确,是吗?有关修复,请参阅this answer
    【解决方案3】:

    您不能删除“labs(color = "Scenario")”这一行吗? 这是生成的情节。不确定它是否缺少您需要的任何东西。

    结果对我来说似乎很好:

    【讨论】:

    • 两件事,我想更改图例的标题。是的,从技术上讲,我可以给有问题的列一个不同的名称,但我更愿意在绘图步骤中这样做。情节中的风格变化也不会传播到两个图例。
    • 当然,这是一种解决方法。但是,我不知道为什么我们不能在这个例子中修改图例标题。我试过没有成功
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 2020-07-08
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    • 2018-07-12
    相关资源
    最近更新 更多