可以在组合线和点图上更改颜色和形状,同时每个图形保留一个图例吗?

时间:2013-05-14 19:58:15

标签: r colors ggplot2 legend shapes

使用以下数据框:

day <- gl(8,1,48,labels=c("Mon","Tues","Wed","Thurs","Fri","Sat","Sun","Avg"))
day <- factor(day, level=c("Mon","Tues","Wed","Thurs","Fri","Sat","Sun","Avg"))
month<-gl(3,8,48,labels=c("Jan","Mar","Apr"))
month<-factor(month,level=c("Jan","Mar","Apr"))

snow<-gl(2,24,48,labels=c("Y","N"))
snow<-factor(snow,levels=c("Y","N"))
count <-c(.94,.95,.96,.98,.93,.94,.99,.9557143,.82,.84,.83,.86,.91,.89,.93,.8685714,1.07,.99,.86,1.03,.81,.92,.88,.9371429,.94,.95,.96,.98,.93,.94,.99,.9557143,.82,.84,.83,.86,.91,.89,.93,.8685714,1.07,.99,.86,1.03,.81,.92,.88,.9371429)
d <- data.frame(day=day,count=count,month=month,snow=snow)

我想在下图中更改按月分组的线条和点的颜色和形状:

library(ggplot2)
library(scales)

ggplot(data=d[d$day=="Avg",],aes(x=day, y=count, fill=month,group=month,label=month),show_guide=F)+
facet_wrap(~snow,ncol=1,scales="free")+
geom_line(data=d[d$day!="Avg",],aes(x=day, y=count, group=month, colour=month), show_guide=F)+
scale_x_discrete(limits=levels(d$day))+
scale_y_continuous(labels = percent)+
geom_point(aes(colour = month),size = 4,position=position_dodge(width=1.2))+
expand_limits(y=0)

enter image description here

  1. 如何更改折线图和点的颜色和形状(我意识到存在许多选项),以便它们仍按月分组?
  2. 注意:需要每个图形具有适当形状/颜色的单个图例(如果您可以在不使用grid.arrange的情况下弄清楚如何为每个图形创建图例,则可获得奖励点。)

2 个答案:

答案 0 :(得分:3)

我相信@thunk是正确的,但你的代码还有一些问题。 (1)您指定fill,但之后不使用任何带有fill的geoms。 (2)您在第一个ggplot中设置默认美学,然后在geom s中不必要地重置它们。 (3)你想要改变形状,但你从不指定形状美学。

我认为这给了你想要的东西:

ggplot(data=d[d$day=="Avg",],
       aes(x=day, y=count, color=month, group=month,
           label=month, shape = month), show_guide=F)+
    facet_wrap(~snow, ncol=1, scales="free")+
    geom_line(data=d[d$day!="Avg", ])+
    scale_x_discrete(limits=levels(d$day))+
    scale_y_continuous(labels = percent)+
    geom_point(size = 4, position = position_dodge(width=1.2))+
    scale_color_manual(values = c("dodgerblue4", "firebrick4", "forestgreen")) +
    expand_limits(y=0)

fixed plot

在初始aes的第一个ggplot()来电中,我们指定colorshape都按月变化。然后,在geom_linegeom_point来电中,我们不需要再这样说了。添加scale_color_manual()可让我们选择我们想要的任何颜色(如果您想指定形状,添加scale_shape_manual()将适用于此)。

希望这有帮助!

答案 1 :(得分:2)

我认为您可以通过在图表创建中添加以下行来实现您想要做的事情:

+ scale_colour_manual(values = c("yellow","pink", "brown"))

在这里你可以选择你想要的线条和点数。 scale_shape_manual等可以做同样的事情。仔细看看文档:

http://docs.ggplot2.org/current/scale_manual.html

但总的来说,我认为您制作的图表并不一定以最有用和最易用的方式描绘您拥有的数据。因此,可能需要重新考虑您希望此图表告诉您的内容,例如重新考虑如果将一周中的某一天与一行联系起来是有帮助的,因为这些值实际上是工作日的平均值,因此这些平均值并非按时间顺序连接在线性顺序中。而且我也认为将平均值放在同一个图表中(好像是另一天)会增加一些混乱。但是,我不知道更大的情况......