下图显示了控制刻度颜色手册时的2个图例

时间:2016-07-15 16:46:20

标签: r ggplot2

嗨,我有下面的情节,有2个传说出现。我有一个问题:

目前我添加的图例有6个条目“A值”,“广告价值”,“au值”,“b”,“bD值”和“bU值”。我真的希望传奇只显示4个条目

  • “A”,在图例中,这应该是一条蓝色实线,就像它已经是
  • 一样
  • “bd& bu”,在传说中,这应该是一条蓝色DASHED线...不知道如何获得此
  • “A”,在图例中,这应该是一条红色实线,就像它已经是
  • 一样
  • “ad& au”,在图例中,这应该是红色DASHED行...不确定如何实现此

有什么想法吗?

enter image description here

d =  data.frame (title =        c(  rep(c("aU","A","ad"),2), rep(   c("bU","b","bD"),2 ) )  ,
               time = c(1,1,1,2,2,2,1,1,1,2,2,2)   ,
               value = c(10,8,4,9,7,3,5,3,1,4,2,0))

d
 ggplot(data=d , aes(x=time, y=value, 
                                group=title, 
                                colour = title,
                                linetype =title))+
     geom_line()  + geom_point() +


       scale_colour_manual( name = "Metric",  

                                  values = c( 
                                  A = "red", 
                                  ad = "red",
                                  aU = "red",
                                  b = "blue",
                                  bU ="blue",
                                  bD= "blue"),

                                  labels = c( 
                                  A = "A value", 
                                  ad = "Ad value", 
                                  aU = "au value",
                                  b = "b",
                                  bU ="bU vlaue",
                                  bD= "dD Value")
                            )+

    scale_linetype_manual(name = "Metric",
                                 values =c(
                                  A = "solid", 
                                  ad = "dashed", 
                                  aU = "dashed",
                                  b = "solid",
                                  bU ="dashed",
                                  bD= "dashed"),
                              labels = c( 
                                  A = "A value", 
                                  ad = "Ad value", 
                                  aU = "au value",
                                  b = "b",
                                  bU ="bU vlaue",
                                  bD= "dD Value")
                          )

2 个答案:

答案 0 :(得分:2)

第二个图例正在显示,因为您只在两个指南之一中更改了标签和标题。如果您更改另一个以匹配它(或者更好,更改title列以匹配您想要的标签),颜色和线型将一起显示在一个图例中。

或者,如果分组匹配(即,如果“U”在“A”和“B”中表示相同的内容),您可以在其中一个上设置颜色,在另一个上设置线型(出现成为你现在正在做的事情)。像这样:

d2 <-
  tidyr::separate(d
                  , title
                  , c("group","subgroup")
                  , 1
                  , FALSE)

ggplot(data=d2
       , aes(x=time, y=value, 
             group=title, 
             colour = group,
             linetype =subgroup))+
  geom_line()  + geom_point()

如果您还想要,可以手动设置颜色和线型。

enter image description here

或者,对于您目前的方法:

ggplot(data=d , aes(x=time, y=value, 
                    group=title, 
                    colour = title,
                    linetype =title))+
  geom_line()  + geom_point() +


  scale_colour_manual( 
                       values = c( 
                         A = "red", 
                         ad = "red",
                         aU = "red",
                         b = "blue",
                         bU ="blue",
                         bD= "blue")
  )+

  scale_linetype_manual(values =c(
    A = "solid", 
    ad = "dashed", 
    aU = "dashed",
    b = "solid",
    bU ="dashed",
    bD= "dashed")
  )

要设置两种线型,您可以使用:

d2$forLabel <- ifelse(d2$subgroup == "", "Value", "Limit")


ggplot(data=d2
       , aes(x=time, y=value, 
             group=title, 
             colour = group,
             linetype =forLabel))+
  geom_line()  + geom_point() +
  scale_linetype_manual(values = c(Limit = "dashed"
                                   , Value = "solid"))

enter image description here

我建议不要为所有内容添加单独的标签(特别是在以后添加更多群组的情况下)

作为另一种选择,如果您要显示间隔,是否会考虑使用功能区而不是两条线?

d3 <-
  d2 %>%
  group_by(group,time) %>%
  summarise(min = min(value), max=max(value)
            , value = value[forLabel=="Value"])

d3 <-
  d2 %>%
  group_by(group,time) %>%
  summarise(min = min(value), max=max(value)
            , value = value[forLabel=="Value"])


ggplot(data=d3
       , aes(x=time, y=value, 
             color = group))+
  geom_line()  + geom_point() +
  geom_ribbon(aes(ymin = min, ymax = max
                  , fill = group
                  , color = NULL)
              , alpha = 0.2
              , color = NA) +
  theme_minimal()

enter image description here

答案 1 :(得分:0)

d1 <- data.frame(title = c("aU","A","ad","bU","b","bD"), 
                title2 = c("aU & ad", "A", "aU & ad", 
                           "bU & bD", "b", "bU & bD"))

d2 <- merge(d, d1, by = "title")

ggplot(d2 , aes(x = time, y = value, group = title, 
                colour = title2, linetype = title2)) +
    geom_line() + geom_point() + 
    scale_colour_manual(name = "Metric", 
                        values = c("A" = "red", "aU & ad" = "red", 
                                   "bU & bD" = "blue", "b" = "blue")) +
    scale_linetype_manual(name = "Metric", 
                          values = c("A" = "solid", "aU & ad" = "dashed", 
                                      "bU & bD" = "dashed", "b" = "solid"))

enter image description here

您可以使用ifelse创建title2,我使用merge,因为我觉得它更清洁