我有4个扇区(A,B,C,D)和5年的数据.我想绘制4行,每个扇区1个,每年添加一个点,并使用stat_summary语句添加表示平均线的第五行,scale_color_manual并通过aes()参数中的点形状控制线颜色.问题是,如果我添加点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)
Run Code Online (Sandbox Code Playgroud)
现在让我们开始绘制图表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")
Run Code Online (Sandbox Code Playgroud)
在此图中,我们将线条颜色和点形状的图例合二为一:
但是,如果我使用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")
Run Code Online (Sandbox Code Playgroud)
我得到了平均(红色)线,但图例分为两部分,一部分用于线条颜色,另一部分用于点形状.此时我的问题是:如何使用第一个图形中的图例获得带有图例的平均线图?也就是说,如何在第二个图形中只得到一个组合线条和形状的图例,其中绘制了平均线?
试试这个:
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")
Run Code Online (Sandbox Code Playgroud)

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