我有4个扇区(A,B,C,D)和5年的数据。我想绘制4行,每个扇区1行,每年添加一个点,并使用stat_summary语句添加表示平均线的第五行,并通过scale_color_manual
和aes()
中的点形状控制线颜色{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")
在此图中,我们将图例中的线条颜色和点形状集合在一起:
但如果我使用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")
我得到平均(红色)线,但图例分为两部分,一部分用于线条颜色,另一部分用于点形状。此时我的问题是:如何使用第一个图形中的图例获得带有图例的平均线图?也就是说,如何在第二个图形中只获得一个组合线条和形状的图例,其中绘制了平均线?
答案 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")
也许更有知识的人可以进来并纠正我的解释(或提供更好的解决方案),但这就是我理解的方式:你在颜色标度中有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