[R] scale_*_manual in ggplot2

Jeff Newmiller jdnewmil at dcn.davis.ca.us
Thu Aug 14 08:53:01 CEST 2014


There is a difference between specifying a scale inside the aes or 
aes_string functions, and doing it in the arguments to the geom function. 
Inside the aes function call it creates a mapping from your input data to 
the layer variables, and you do not want to specify strings such as 
"Cusum" but rather always specify variables such as Cusum. Outside the aes 
function among the geom parameters, you can create ad-hoc settings for 
that geom that might specify colors as strings.  However, AFAIK you cannot 
build a legend in ggplot2 that describes those ad-hoc settings, so if you 
want a legend that mentions them then you need to create your data to 
contain e.g. all colour settings in one or more columns of a "long" 
version of your data (it definitely works best to have them all in one 
column). You can use the subset option to partition your "long" data among 
the different geoms even while having all the colour settings in the same 
column. The "reshape2" package is useful for creating these special 
display-ready data frames that stack variables together to fit the 
graphic you are mapping it to.

I could not get your sample code to run, and I am daunted by the 
complexity of your sample code. Perhaps the above tips will help, or you 
can post a simpler example.  One way or another, you will need to learn 
the language of visualization that ggplot2 is designed around... perhaps 
read Hadley Wickhams "ggplot" book. If that paradigm doesn't fit your way 
of thinking, then you might have more success using lattice plots.

On Wed, 13 Aug 2014, Pavneet Arora wrote:

> Data
> this is the data I used for the following problems:
>
> dput(sdf)
> structure(list(weeks = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 
> 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 
> 29, 30), values = c(9.45, 7.99, 9.29, 11.66, 12.16, 10.18, 8.04, 
> 11.46, 9.2, 10.34, 9.03, 11.47, 10.51, 9.4, 10.08, 9.37, 10.62, 
> 10.31, 10, 13, 10.9, 9.33, 12.29, 11.5, 10.6, 11.08, 10.38, 11.62, 
> 11.31, 10.52), deviation = c(-0.550000000000001, -2.01, 
> -0.710000000000001, 
> 1.66, 2.16, 0.18, -1.96, 1.46, -0.800000000000001, 0.34, 
> -0.970000000000001, 
> 1.47, 0.51, -0.6, 0.0800000000000001, -0.630000000000001, 
> 0.619999999999999, 
> 0.31, 0, 3, 0.9, -0.67, 2.29, 1.5, 0.6, 1.08, 0.380000000000001, 
> 1.62, 1.31, 0.52), cusums = c(-0.550000000000001, -2.56, -3.27, 
> -1.61, 0.549999999999999, 0.729999999999999, -1.23, 0.229999999999999, 
> -0.570000000000002, -0.230000000000002, -1.2, 0.269999999999998, 
> 0.779999999999998, 0.179999999999998, 0.259999999999998, 
> -0.370000000000003, 
> 0.249999999999996, 0.559999999999997, 0.559999999999997, 3.56, 
> 4.46, 3.79, 6.08, 7.58, 8.18, 9.26, 9.64, 11.26, 12.57, 13.09
> ), ma = c(NA, 1.46, 1.3, 2.37, 0.5, 1.98, 2.14, 3.42, 2.26, 1.14, 
> 1.31, 2.44, 0.960000000000001, 1.11, 0.68, 0.710000000000001, 
> 1.25, 0.309999999999999, 0.31, 3, 2.1, 1.57, 2.96, 0.789999999999999, 
> 0.9, 0.48, 0.699999999999999, 1.24, 0.309999999999999, 0.790000000000001
> ), Vupper = c(32.59, 32.09, 31.59, 31.09, 30.59, 30.09, 29.59, 
> 29.09, 28.59, 28.09, 27.59, 27.09, 26.59, 26.09, 25.59, 25.09, 
> 24.59, 24.09, 23.59, 23.09, 22.59, 22.09, 21.59, 21.09, 20.59, 
> 20.09, 19.59, 19.09, 18.59, 18.09), Vlower = c(-6.41, -5.91, 
> -5.41, -4.91, -4.41, -3.91, -3.41, -2.91, -2.41, -1.91, -1.41, 
> -0.910000000000004, -0.410000000000004, 0.0899999999999963, 
> 0.589999999999996, 
> 1.09, 1.59, 2.09, 2.59, 3.09, 3.59, 4.09, 4.59, 5.09, 5.59, 6.09, 
> 6.59, 7.09, 7.59, 8.09)), .Names = c("weeks", "values", "deviation", 
> "cusums", "ma", "Vupper", "Vlower"), row.names = c(NA, -30L), class = 
> "data.frame")
>
> Problem1:
> I am trying to create a chart using ggplot2. This plot contains 2 
> geom_lines and 1geom_point.
> But for some reason the geom_point is not being picked up by the legend. 
> Can someone help me explain why that maybe?
> This is the code I have used for the above data.
>
> vmaskPlot <- ggplot(sdf,aes(ymin=min(sdf$cusums,sdf$Vupper,sdf$Vlower),
>                        ymax=(max(sdf$cusums,sdf$Vupper,sdf$Vlower)),
>                        x=week))+
>  labs(x=NULL,y=NULL)+
>  #   theme (panel.grid.major=element_line(color="white",size=0.5),
>  #          panel.grid.minor=element_blank(),
>  #          panel.grid.major.x=element_blank(),
>  #          axis.line.y=element_line(color="black"),
>  #          panel.background=element_rect(fill="lightgray"))+
>  #   guide=guide_legend(direction="horizontal",
>  #                      title.position="top",
>  #                      label.position="bottom",
>  #                      label.hjust=0.5,
>  #                      label.vjust=0.5,
>  #                      label.theme=element_text(angle=90))+
> scale_y_continuous()+
>  scale_x_discrete(breaks=seq(min(sdf$week),
>                              max(sdf$week)))+
>  geom_point(aes(y=cusums,colour="Cusum"),size=4,pch=15)+
>  geom_line(aes(y=Vupper,colour="Vupper"),size=2.5,alpha=1/2)+ #alpha = 
> determines the ? of transparency
>  geom_line(aes(y=Vlower,colour="Vlower"),size=2.5,alpha=1/2)+
>  geom_hline(aes(yintercept=0),colour="gray20",size=1)+ #geom_hline - 
> draws a reference line at 0
>  ggtitle("V-Mask Cusum")+
>  theme(legend.position=c(0.9,0.9),
>        plot.title=element_text(family="Times",
>                                face="bold",
>                                size=20))+
>  scale_color_manual(name="Legend",
>                     breaks=c("cusums","Vupper","Vlower"),
>                     values=c("dodgerblue1","brown3","darkolivegreen4"),
>                     labels=c("CuSums","Upper V-Mask ","Lower V-Mask "))
> 
> vmaskPlot
> Problem2:
> In this ggplot, the legend is coming in separate boxes ? is there any way 
> I can combine them in same? Also where it says ?tabuCusum$cusums? ? I just 
> want it to say ?CuSums?. I thought I had mentioned this in my code, so why 
> is it not picking up?
> Furthermore, the code doesn?t seem to pick up the colours I suggested, 
> except for the bars ? which are exactly like I want them to be.
> But I want the pink dots to dodgerblue1. The 2 horizontal lines close to 
> y=0 were supposed to be gold2 colour and the 2 outer horizontal lines were 
> supposed to be darkorchid colour as mentioned in the code. 
> Does anyone know why it?s not picking up the colours mentioned?
> Following is my code:
> ggplot(sdf,aes(x=weeks,
>                     ymin=min(sdf$cusums,sdf$Tupper,sdf$Tlower)-3,
>                     ymax=max(sdf$cusums,sdf$Tupper,sdf$Tlower)+3))+
>  labs(x=NULL,y=NULL)+
>  scale_y_continuous(expand=c(0,0),
>                     minor_breaks=seq(round(min(sdf$cusums,sdf$Tupper,
> sdf$Tlower)-2),
>                                      round(max(sdf$cusums,sdf$Tupper,
> sdf$Tlower)+2),
>                                      1),
>                     breaks=seq(round(min(sdf$cusums,sdf$Tupper,sdf$Tlower
> )-2),
>                                round(max(sdf$cusums,sdf$Tupper,sdf$Tlower
> )+2),
>                                2))+
>  scale_x_discrete(expand=c(0,0),
>                   breaks=seq(min(sdf$weeks),
>                              max(sdf$weeks)))+
>  geom_bar(data=sdf,aes(y=sdf$Tupper,fill="sdf$Tupper"),stat="identity")+
>  geom_bar(data=sdf,aes(y=sdf$Tlower,fill="sdf$Tlower"),stat="identity")+
>  geom_point(aes(y=sdf$cusums,colour="sdf$cusums"),size=4,pch=15)+
>  geom_hline(aes(yintercept=0,colour="Line1"),size=1)+
>  geom_hline(aes(yintercept=5,colour="Line2"),size=2,alpha=1/1.3)+ 
> #Out-Of-Signal Lines
>  geom_hline(aes(yintercept=-5,colour="Line3"),size=2,alpha=1/1.3)+ 
> #Out-Of-Signal Lines
>  geom_hline(aes(yintercept=0.5,colour="Line4"),size=2,alpha=1/1.3)+ #K
>  geom_hline(aes(yintercept=-0.5,colour="Line5"),size=2,alpha=1/1.3)+ #K
>  theme(legend.position=c(0.1,0.7),
>        plot.title=element_text(family="Times",
>                                face="bold",
>                                size=20))+
> #   guides(linetype = guide_legend(override.aes = list(colour = 
> c("gray20","darkorchid","darkorchid","gold2","gold2"))))+
> # 
> override.aes=list(colour=c("gray20","darkorchid","darkorchid","gold2","gold2")) 
>
>  # LEGEND FOR BAR CHART
>  scale_fill_manual(name="Legend",
>                    breaks=c("sdf$Tlower","sdf$Tupper","sdf$cusums",
>                             "Line1","Line2","Line3","Line4","Line5"),
>                    values=c("darkolivegreen4","brown3","dodgerblue1",
>                             "gray20","darkorchid","darkorchid","gold2",
> "gold2"),
>                    labels=c("Lower Tabular Mask","Upper Tabular Mask",
> "Cusum",
>                             "Line1","Line2","Line3","Line4","Line5"))
>
> ***********************************************************************************************************************************************************************************************************************
> MORE TH>N is a trading style of Royal & Sun Alliance Insurance plc (No. 93792). Registered in England and Wales at St. Mark?s Court, Chart Way, Horsham, West Sussex, RH12 1XL. 
>
> Authorised by the Prudential Regulation Authority and regulated by the Financial Conduct Authority and the Prudential Regulation Authority.
> ************************************************************************************************************************************************************************************************************************
>
> 	[[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.

---------------------------------------------------------------------------
Jeff Newmiller                        The     .....       .....  Go Live...
DCN:<jdnewmil at dcn.davis.ca.us>        Basics: ##.#.       ##.#.  Live Go...
                                       Live:   OO#.. Dead: OO#..  Playing
Research Engineer (Solar/Batteries            O.O#.       #.O#.  with
/Software/Embedded Controllers)               .OO#.       .OO#.  rocks...1k



More information about the R-help mailing list