ggplot只需要一个图例,但生成了两个图例

4
在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

Result of Current Code


你可以在自定义的 scale_* 函数中使用 name = 参数来更改图例标题,例如 + guides(linetype = FALSE) 可以隐藏与 scale_* 函数相关联的图例。但个人而言,在这种情况下我只会使用颜色来区分组别。 - neilfws
3个回答

3

如果您希望 ggplot 合并图例,则所有图例都必须具有相同的标题。您可以使用 scales 中的 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()

enter image description here


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

enter image description here


1
但是,场景 B 的图例键(linetype)并不完全正确,是吗?请参见此答案以进行修复。 - Tung

0

你能不能只移除掉 "labs(color = "Scenario")" 这一行呢? 这是生成的图表。不确定是否缺少了你所需的内容。

对我来说,结果看起来不错: (对我来说看起来不错)


有两件事,我想要改变图例的标题。从技术上讲,我可以只是给相关列一个不同的名称,但我更喜欢在绘图步骤中完成它。此外,图中的样式更改未传播到两个图例。 - vcelloho
当然,这是一个解决方法。但是,我不知道为什么我们不能在这个例子中修改图例标题。我尝试过,但没有成功。 - lcgodoy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接