【问题标题】:Show only specific lines and an area in one legend with ggplot2使用 ggplot2 在一个图例中仅显示特定的线条和区域
【发布时间】:2017-04-26 18:19:12
【问题描述】:

我有一个关于某个情节的问题。考虑我有以下data.frame:

data <- data.frame(a = c(44, 58, 60, 63, 65, 66, 67, 68, 69, 70), 
               b = c(38, 52, 55, 57, 59, 60, 61, 62, 63, 65),
               c = c(51, 64, 66, 68, 70, 71, 71, 73, 74, 75),
               d = c(44, 53, 54, 55, 56, 56, 58, 59, 59, 60),
               e = c(44, 57, 59, 60, 62, 63, 64, 65, 66, 67),
               x = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))
rownames(data) = c('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J')

我想用三种不同的线型“solid”、“dotdash”和“dash”绘制三个多边形 (x,a)、(x,d)、(x,e)。它们都应该出现在图例中。此外,我想用线型'dotted'绘制多边形(x,b),(x,c)并将它们之间的颜色涂成红色。只有红色区域应该显示在图例中,而不是虚线本身。为此,我编写了以下代码行:

data_no_legend = data[,c(2,3,6)]
data_legend = data[,c(1,4,5,6)]

data_melt_legend = melt(data_legend, id = "x")
data_melt_no_legend = melt(data_no_legend, id = "x")

p <- ggplot()
p <- p + geom_ribbon(data = data, aes(x = x, ymin = b, ymax = c,fill = 'legend'), alpha = 0.5, show.legend = TRUE, inherit.aes = FALSE)
p <- p + scale_fill_manual(labels = c("legend"), values = c('red'))
p <- p + geom_line(data = data_melt_legend, aes(x = x, y = value,    size = variable, linetype= variable), color = 'gray', show.legend = TRUE,  inherit.aes=FALSE)
p <- p + scale_linetype_manual(labels = c("legend 1","legend 2", "legend 3"),values = c("solid","dashed", "dotdash"))
p <- p + scale_size_manual(labels = c("legend 1","legend 2", "legend 3"),values = c(1,0.5,0.5))
p <- p + geom_line(data = data_melt_no_legend, aes(x = x, y = value,  group= variable), color= 'gray', linetype = 'dotted', show.legend = FALSE,  inherit.aes=FALSE)
p <- p + geom_point(data=data, aes(x = x, y = a), color = 'gray',  size = 1.5,inherit.aes=FALSE)

不幸的是,我有两个不同的传说。一个用于线路,一个用于区域。谁能帮我吗?谢谢!

【问题讨论】:

  • 我认为您在x 列中错过了 9。此外,data_melt_indexdata_melt_no_index 也无处可寻。你是指data_melt_legenddata_melt_no_legend 吗?
  • 那么您的问题是关于删除“填充”图例,还是您想将它与线图例结合起来?在后一种情况下,您是希望它只添加第四个键,还是希望“图例 1”、“图例 2”和“图例 3”都具有颜色作为背景?
  • 我想将它与线条图例结合起来,只需将彩色区域添加为第四个键。

标签: r plot ggplot2 legend


【解决方案1】:

好的,这需要做一些工作,但我认为这是可行的。我正在生成一个名为“Legend”的新列,它应该显示您试图在图例本身中显示的内容(因此,您可能想要更新它)。请注意,我使用来自tidyversegather 而不是melt,并使用来自dplyrmutate 来生成这种数据格式。

诀窍在于,您需要设置一个线型,其中包含您希望从geom_line 获得行的值。我将大小设置为 0 以避免重复打印该行。然后,添加线条并设置要打印的美感。最后一个技巧是使用override.aes 更改线条后面的填充颜色(本质上,将其添加到geom_ribbon 组)并抑制填充的单独图例(如果您使用show.legend = FALSE,它不会让您也可以为 linetype 图例设置填充)。

gatheredData <-
  data %>%
  gather(variable, value, -x) %>%
  mutate(Legend = ifelse(variable %in% c("b","c")
                         , "bc", variable)
         , Legend = factor(Legend
                           , levels = c("a", "d", "e", "bc")))

ggplot() +
  geom_ribbon(aes(x = x
                  , ymax = c
                  , ymin = b
                  , fill = "bc"
                  , linetype = factor("bc"
                                      , levels = levels(gatheredData$Legend))
                  )
              , data = data
              , size = 0) +
  geom_line(aes(x = x
                , y = value
                , linetype = Legend
                , group = variable)
            , gatheredData) +
  scale_linetype_manual(values = c(a ='solid'
                                   , d = 'dotdash'
                                   , e = 'dashed'
                                   , bc = 'dotted')
                        , name = "Legend"
                        , breaks = levels(gatheredData$Legend)) +
  scale_fill_manual(values = c(bc = 'red')
                    , drop = FALSE) +
  guides(
    linetype = guide_legend(override.aes = list(fill = c("gray", "gray", "gray", "red")))
    ,    fill = "none"
    )

给予

请注意,我使用图例级别来设置图例条目的顺序。由于某种原因,它真的很挑剔,需要我明确设置breaks =

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多