5

我有 4 个部门(A、B、C、D)和 5 年的数据。我想画 4 条线,每个部门 1 条,每年添加一个点,并使用 stat_summary 语句添加代表平均线的第五条线,并通过参数中的scale_color_manual点形状控制线条颜色aes()。问题是,如果我添加点几何图形,则图例分为两部分,一部分用于点形状,另一部分用于线条颜色。我不明白如何获得 1 个结合颜色和点的图例。

这是一个例子。首先让我们dtfr按如下方式构建数据框:

a <- 100; b <- 100; c <- 100; d <- 100
for(k in 2:5){
  a[k] <- a[k-1]*(1+rnorm(1)/100)
  b[k] <- b[k-1]*(1+rnorm(1)/100)
  c[k] <- c[k-1]*(1+rnorm(1)/100)
  d[k] <- d[k-1]*(1+rnorm(1)/100)
}
v <- numeric()
for(k in 1:5){ v <- c(v,a[k],b[k],c[k],d[k]) }

dtfr <- data.frame(Year=rep(2008:2012,1, each=4), 
                   Sector=rep(c("A","B","C","D"),5), 
                   Value=v, 
                   stringsAsFactors=F)

现在让我们开始绘制我们的图形ggpolt2。在第一张图中,我们绘制了没有中线的直线和点 geom:

library(ggplot2)
ggplot(dtfr, aes(x=Year, y=Value)) +
  geom_line(aes(group=Sector, color=Sector)) +
  geom_point(aes(color=Sector, shape=Sector)) +
  # stat_summary(aes(colour="mean",group=1), fun.y=mean, geom="line", size=1.1) +
  scale_color_manual(values=c("#004E00", "#33FF00", "#FF9966", "#3399FF", "#FF004C")) +
  ggtitle("Test for ggplot2 graph")

在此图中,我们将线条颜色和点形状合二为一:

在此处输入图像描述

但是,如果我使用stat_summary以下代码绘制平均线:

ggplot(dtfr, aes(x=Year, y=Value)) +
  geom_line(aes(group=Sector, color=Sector)) +
  geom_point(aes(color=Sector, shape=Sector)) +
  stat_summary(aes(colour="mean",group=1), fun.y=mean, geom="line", size=1.1) +
  scale_color_manual(values=c("#004E00", "#33FF00", "#FF9966", "#3399FF", "#FF004C")) +
  ggtitle("Test for ggplot2 graph")

我得到了平均(红色)线,但图例分为两部分,一部分用于线条颜色,另一部分用于点形状。在这一点上,我的问题是:如何获得带有图例的平均线图,就像第一张图中的图例一样?也就是说,如何在绘制平均线的第二张图中仅获得一个结合线条和形状的图例?

4

2 回答 2

10

尝试这个:

ggplot(dtfr, aes(x=Year, y=Value)) +
    geom_line(aes(group=Sector, color=Sector)) +
    geom_point(aes(color=Sector, shape=Sector)) +
    stat_summary(aes(colour="mean",shape="mean",group=1), fun.y=mean, geom="line", size=1.1) +
    scale_color_manual(values=c("#004E00", "#33FF00", "#FF9966", "#3399FF", "#FF004C")) +
    scale_shape_manual(values=c(1:4, 32)) +
    ggtitle("Test for ggplot2 graph")

带有组合图例的 ggplot2 示例

也许更有知识的人可以进来纠正我的解释(或提供更好的解决方案),但我是这样理解的:色标中有 5 个值,但形状标度只有 4 个;您缺少“平均值”的值。所以天平在某种程度上并不真正兼容。您可以通过为平均线分配一个空白形状 (32) 来解决此问题。

于 2013-06-21T22:17:13.697 回答
1

这是一种不同的方法,它预先计算汇总/平均值,并在构建绘图之前将其作为附加级别添加到数据框中。

该方法可用于轻松添加附加线,但具有特定颜色,例如摘要/平均值可能需要这种颜色。

首先,我计算平均值并将其添加到dtfrOP 中。

dtfr2 <- dtfr %>% 
    dplyr::group_by(Year) %>% 
    dplyr::summarise(Value = mean(Value)) %>% 
    dplyr::mutate(Sector = NA) %>% 
    dplyr::bind_rows(dtfr)

dtfr2现在有额外的行,其平均值存储在ValueNAs 中Sector

然后,构建情节很容易:

p1 <- ggplot(dtfr2, aes(x=Year, y=Value, color = Sector, shape = Sector)) +
    geom_line() +
    geom_point()

最后,您可以稍微调整一下图例:

p1 +
    scale_color_discrete(labels = c(letters[1:4], "M"), na.value = "black") +
    scale_shape_discrete(labels = c(letters[1:4], "M"))

带有特定颜色的附加 geom_line 的 ggplot

于 2017-03-09T08:19:36.733 回答