Actually the data you provided are a data frame and not a matrix as R uses the term. Two columns of gceac are numeric and one is a factor. If we read your data with read.csv() we get:
> str(gceac) 'data.frame': 35 obs. of 3 variables: $ year : int 2014 2014 2014 2014 2014 2014 2014 2015 2015 2015 ... $ grade : Factor w/ 7 levels "A","A*","B","C",..: 2 1 3 4 5 6 7 2 1 3 ... $ percentage: int 9 23 27 19 13 7 2 9 23 27 ... Now we see problem in grade column. Your plot has A* before A, but the factor is created alphabetically so A comes before A*. We can fix that > gceac$grade <- factor(gceac$grade, levels=c("A*", "A", "B", "C", "D", "E", "U")) > levels(gceac$grade) [1] "A*" "A" "B" "C" "D" "E" "U" Now you need a matrix for the barplot. That is simple with xtabs() > gceac.mat <- xtabs(percentage~grade+year, gceac) > gceac.mat year grade 2014 2015 2016 2017 2018 A* 9 9 8 8 8 A 23 23 23 23 22 B 27 27 27 24 23 C 19 19 19 20 20 D 13 13 13 14 15 E 7 7 7 8 8 U 2 2 3 3 3 Now we can build your bar plot using almost the same command you used: > clrs <- c('aliceblue', 'aquamarine', 'blue', 'chocolate', 'darkgreen', + 'firebrick', 'violet') > barplot(gceac.mat, xlab='year', ylab='percentage of each grade', + col=clrs, legend=TRUE, args.legend = list("topright", + title='grades'), main='A-level grades, chemistry', beside=T, + space=c(0, 1), ylim=c(0,35)) I defined clrs so that the barplot() function would be easier to read, but it works the same your way. Now we just need legend=TRUE and we can position the legend in the top right with the args.legend= argument. The legend overlaps the bars a bit so I increased the y-axis to 35. A .png file is attached. David L. Carlson Department of Anthropology Texas A&M University -----Original Message----- From: R-help [mailto:r-help-boun...@r-project.org] On Behalf Of Peter Langfelder Sent: Sunday, August 19, 2018 10:51 AM To: c...@disroot.org Cc: r-help <r-help@r-project.org> Subject: Re: [R] [FORGED] Re: bar plot add space to group data On Sun, Aug 19, 2018 at 7:15 AM <c...@disroot.org> wrote: > > August 19, 2018 4:58 AM, "Peter Langfelder" <peter.langfel...@gmail.com> > wrote: > > > To the OP, try formatting the data to be plotted as a matrix, not as a > > vector > > CSV data provided in a previous message; is not the data formatted as a > matrix? I meant the data you give to barplot - your code supplies only the third column of the data frame, so barplot only sees a vector. I would try something like plotData = do.call(cbind, tapply(csv.data$percentage, csv.data$year, identity)) barplot(plotData, <rest of your argument>) Peter ______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see 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.
______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see 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.