Dimitri Liakhovitski
2009-May-16 18:57 UTC
[R] Question about barplot: gridlines & value labels
Hello! I promise I looked into help files before asking. Still cannot figure it out. I think it's because I am totally confused what packages use lettice, which use trellis, etc. Sections 1 and 2 below produce the data and the data to plot. My question is about barplot in Section 3. I am trying to: 1. add only horizontal gridlines and manipulate the type and color of that line. tck = 1 is not flexible enough to do it. 2. make the legend come on top of gridlines and not under them 3. add plotted Y values above the bars Thank you very much for any pointers! Dimitri ### Section 1: generates my data set "data": N<-100 myset1<-c(1,2,3,4,5) probs1<-c(.05,.10,.15,.40,.30) group<-unlist(lapply(1:4,function(x){ out<-rep(x,25) return(out) })) set.seed(1) a<-sample(myset1, N, replace = TRUE,probs1) a[which(rbinom(100,2,.01)==1)]<-NA set.seed(12) b<-sample(myset1, N, replace = TRUE,probs1) b[which(rbinom(100,2,.01)==1)]<-NA set.seed(123) data<-data.frame(group,a=a,b=b) data["group"]<-lapply(data["group"],function(x) { x[x %in% 1]<-"Group 1" x[x %in% 2]<-"Group 2" x[x %in% 3]<-"Group 3" x[x %in% 4]<-"Group 4" return(x) }) data$group<-as.factor(data$group) lapply(data,table,exclude=NULL) ### Section 2. Creating data to plot: table.a<-with(data,table(group,a)) table.a.percents<-apply(table.a,2,function(x){ out<-round(x*100/sum(x),1) return(out) }) ### Section 3. Creating a plot: barplot(table.a.percents,xlab = "Values", ylab "Percentages",ylim=c(0,100),axis.lty=1,legend=T,beside=T,tck = 1) -- Dimitri Liakhovitski MarketTools, Inc. Dimitri.Liakhovitski at markettools.com
Dimitri You mentioned lattice so I presumed that you tried a barchart in lattice if you found the class of table.a.percents will it comply with the lattice requirements of the data type ? class(table.a.percents) [1] "matrix" Using the lattice package and converting to a data.frame x <- data.frame(Group = rep(paste("Group", 1:4), 5), a = rep(1:5,each=4),percentage = as.vector(table.a.percents)) barchart(percentage~a,x,groups = Group, horizontal = F, auto.key = T, ylim = c(0,60)) will get you started in lattice, and customize as required see also ?make.groups PS ?sweep may be of interest in your data manipulation Regards Duncan Mackay Department of Agronomy and Soil Science University of New At 04:57 17/05/2009, you wrote:>Hello! >I promise I looked into help files before asking. Still cannot figure >it out. I think it's because I am totally confused what packages use >lettice, which use trellis, etc. >Sections 1 and 2 below produce the data and the data to plot. My >question is about barplot in Section 3. I am trying to: >1. add only horizontal gridlines and manipulate the type and color of >that line. tck = 1 is not flexible enough to do it. >2. make the legend come on top of gridlines and not under them >3. add plotted Y values above the bars > >Thank you very much for any pointers! >Dimitri > >### Section 1: generates my data set "data": > >N<-100 >myset1<-c(1,2,3,4,5) >probs1<-c(.05,.10,.15,.40,.30) > >group<-unlist(lapply(1:4,function(x){ > out<-rep(x,25) > return(out) >})) >set.seed(1) >a<-sample(myset1, N, replace = TRUE,probs1) >a[which(rbinom(100,2,.01)==1)]<-NA >set.seed(12) >b<-sample(myset1, N, replace = TRUE,probs1) >b[which(rbinom(100,2,.01)==1)]<-NA >set.seed(123) >data<-data.frame(group,a=a,b=b) >data["group"]<-lapply(data["group"],function(x) { > x[x %in% 1]<-"Group 1" > x[x %in% 2]<-"Group 2" > x[x %in% 3]<-"Group 3" > x[x %in% 4]<-"Group 4" > return(x) >}) >data$group<-as.factor(data$group) >lapply(data,table,exclude=NULL) > >### Section 2. Creating data to plot: >table.a<-with(data,table(group,a)) >table.a.percents<-apply(table.a,2,function(x){ > out<-round(x*100/sum(x),1) > return(out) >}) > >### Section 3. Creating a plot: >barplot(table.a.percents,xlab = "Values", ylab >"Percentages",ylim=c(0,100),axis.lty=1,legend=T,beside=T,tck = 1) > >-- >Dimitri Liakhovitski >MarketTools, Inc. >Dimitri.Liakhovitski at markettools.com > >______________________________________________ >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.
Dimitri Liakhovitski wrote:> Hello! > I promise I looked into help files before asking. Still cannot figure > it out. I think it's because I am totally confused what packages use > lettice, which use trellis, etc. > Sections 1 and 2 below produce the data and the data to plot. My > question is about barplot in Section 3. I am trying to: > 1. add only horizontal gridlines and manipulate the type and color of > that line. tck = 1 is not flexible enough to do it. > 2. make the legend come on top of gridlines and not under them > 3. add plotted Y values above the bars > > Thank you very much for any pointers! > Dimitri > > ### Section 1: generates my data set "data": > > N<-100 > myset1<-c(1,2,3,4,5) > probs1<-c(.05,.10,.15,.40,.30) > > group<-unlist(lapply(1:4,function(x){ > out<-rep(x,25) > return(out) > })) > set.seed(1) > a<-sample(myset1, N, replace = TRUE,probs1) > a[which(rbinom(100,2,.01)==1)]<-NA > set.seed(12) > b<-sample(myset1, N, replace = TRUE,probs1) > b[which(rbinom(100,2,.01)==1)]<-NA > set.seed(123) > data<-data.frame(group,a=a,b=b) > data["group"]<-lapply(data["group"],function(x) { > x[x %in% 1]<-"Group 1" > x[x %in% 2]<-"Group 2" > x[x %in% 3]<-"Group 3" > x[x %in% 4]<-"Group 4" > return(x) > }) > data$group<-as.factor(data$group) > lapply(data,table,exclude=NULL) > > ### Section 2. Creating data to plot: > table.a<-with(data,table(group,a)) > table.a.percents<-apply(table.a,2,function(x){ > out<-round(x*100/sum(x),1) > return(out) > }) > > ### Section 3. Creating a plot: > barplot(table.a.percents,xlab = "Values", ylab > "Percentages",ylim=c(0,100),axis.lty=1,legend=T,beside=T,tck = 1) > >Hi Dimitri, I think you will have to display the legend separately: legend(20,90,rownames(table.a.percents), fill=c("gray30","gray50","gray70","gray90"),bg="white") I tried passing the bg="white" argument in barplot, but it had no effect. Probably gobbled by another function before it got to legend. Jim
Seemingly Similar Threads
- Barchart in lattice - wrong order of groups, data labels on top of each other, and a legend question
- barplot in a loop not printing out to directory
- interaction.plot - gridlines and formatting legend title...
- figure margins too large for a barplot in png, pdf ok
- Hmisc and Lattice question on gridlines