【问题标题】:Controlling legend labels for a plot with color and linetype aesthetic attributes控制具有颜色和线型美学属性的绘图的图例标签
【发布时间】:2015-12-16 17:24:15
【问题描述】:

我想用图例标签 AND 绘制四条线,颜色由列中的唯一值“Color_Group”和“Line_Type_Group”的线型决定。这是制作数据框和数据框本身所需的代码。

data <- data.frame("x"=c(1,2,1,2,1,2,1,2),
                "y"=1:8,
                "Color_Group"=c("A","A","A","A","B","B","C","C"),
                "Line_Type_Group"=c(1,1,2,2,2,2,1,1),
                "Group"=c("A1","A1","A2","A2","B2","B2","C1","C1"),
                stringsAsFactors=F)

> data
  x y Color_Group Line_Type_Group  Group
  1 1           A               1     A1
  2 2           A               1     A1
  1 3           A               2     A2
  2 4           A               2     A2
  1 5           B               2     B2
  2 6           B               2     B2
  1 7           C               1     C1
  2 8           C               1     C1

主“组”列是将颜色列和线型列粘贴在一起的结果,它表示每行的 id。为了得到一个图例,我最初将颜色和线型属性映射到这个“组”列。下面是我想要的情节。

想要的情节

尝试

为简单起见,我正在重新创建数据框以包含具有文字颜色和线型值的列。

data <- data.frame("x"=c(1,2,1,2,1,2,1,2),
                "y"=1:8,"Color_Group"=c("A","A","A","A","B","B","C","C"),
                "Color"=c(rep("red",4),"blue","blue","green","green"),
                "Line_Type_Group"=c(1,1,2,2,2,2,1,1),
                "Line_Type"=c("solid","solid","dashed","dashed","dashed","dashed","solid","solid"),
                "Group"=c("A1","A1","A2","A2","B2","B2","C1","C1"),
                stringsAsFactors = F)

> data
  x y Color_Group Color Line_Type_Group Line_Type Group
  1 1           A   red               1     solid    A1
  2 2           A   red               1     solid    A1
  1 3           A   red               2    dashed    A2
  2 4           A   red               2    dashed    A2
  1 5           B  blue               2    dashed    B2
  2 6           B  blue               2    dashed    B2
  1 7           C green               1     solid    C1
  2 8           C green               1     solid    C1  


line_type_group <- data$Line_Type
color_group <- data$Color
names(line_type_group) <- data$Group
names(color_group) <- data$Group
labels <- data$Color_Group
names(labels) <- data$Group
#Both attempts at setting labels variable yields plot below
#labels <- c("A","A","B","C")

g <- ggplot(data,aes(x=x,y=y,colour=Group,linetype=Group))+geom_line()
g + scale_colour_manual(name="Legend",values=color_group,labels=labels) +
    scale_linetype_manual(name="Legend",values =line_type_group,labels=labels)

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    您可以通过在将values 更改为您想要的内容后抑制线型图例来解决此问题,然后使用override.aescolour 图例中“手动”设置线型。

    ggplot(data,aes(x=x, y=y, colour=Group, linetype=Group))+
        geom_line() + 
        scale_colour_manual(values = color_group, labels = labels) +
        scale_linetype_manual(values = line_type_group, guide = "none") +
        guides(colour = guide_legend(override.aes = list(linetype = c(1, 2, 2, 1))))
    

    【讨论】:

      【解决方案2】:

      这几乎可以满足您的需求

      g <- ggplot(data,aes(x=x,y=y,colour=Group,linetype=Group))+geom_line()
      g + scale_colour_manual(name="Legend",values=c("red", "red", "blue", "green"), labels = c("A1", "A2", "B", "C")) +scale_linetype_manual(name="Legend",values=c("solid", "dashed", "dashed", "solid"), labels = c("A1", "A2", "B", "C"))
      #
      g
      

      【讨论】:

      • 是的,我只需在比例函数中省略标签参数即可创建类似的图。棘手的部分是让 ggplot 在定义线型时将 A1 和 A2 识别为两组,在定义颜色和标签名称时识别为一组。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      • 2014-12-10
      • 1970-01-01
      • 2021-09-16
      • 2022-11-22
      • 1970-01-01
      相关资源
      最近更新 更多