当我使用stat_summary与line和point geoms时,我得到了一个双重传奇

时间:2013-06-21 21:55:42

标签: r ggplot2

我有4个扇区(A,B,C,D)和5年的数据。我想绘制4行,每个扇区1行,每年添加一个点,并使用stat_summary语句添加表示平均线的第五行,并通过scale_color_manualaes()中的点形状控制线颜色{1}}论点。问题是,如果我添加点geom,图例将分为两部分,一部分用于点形状,另一部分用于线条颜色。我不明白如何获得一个结合颜色和点的传奇。

这是一个例子。首先,让我们按如下方式构建数据框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")

在此图中,我们将图例中的线条颜色和点形状集合在一起:

enter image description here

但如果我使用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")

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

2 个答案:

答案 0 :(得分:9)

试试这个:

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 example with a combined legend

也许更有知识的人可以进来并纠正我的解释(或提供更好的解决方案),但这就是我理解的方式:你在颜色标度中有5个值,但你只有4个形状标度;你错过了“卑鄙”的价值。所以尺度在某种程度上并不真正兼容。您可以通过为平均线指定空白形状(32)来解决此问题。

答案 1 :(得分:0)

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

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

首先,我计算平均值并将其添加到OP的firebase.auth().createUserWithEmailAndPassword("test@test.com", "passwrd" ).catch(function (error) { if (error) { if (error.code === "auth/email-already-in-use") { console.log('already exists') } } }).then(function (user) { console.log('user created', user) if (user) { db.ref('users/' + user.uid).set(self.info) } }) }

dtfr

dtfr2 <- dtfr %>% dplyr::group_by(Year) %>% dplyr::summarise(Value = mean(Value)) %>% dplyr::mutate(Sector = NA) %>% dplyr::bind_rows(dtfr) 现在有其他行,其平均值存储在dtfr2的{​​{1}}和Value中。

然后,建立情节很容易:

NA

最后,你可以稍微调整一下传奇:

Sector

ggplot with additional geom_line with specific color