I've not before created bar charts, only scatter plots and box plots. Checking in Deepayan's book, searching the web, and looking at ?barchart has not shown me the how to get the results I need. The dataframe looks like this:> head(stage_heights)Year Med Max 1 1989 91.17 93.32 2 1990 91.22 93.43 3 1991 91.24 92.89 4 1993 91.14 93.02 5 1994 93.92 95.74 6 1995 94.34 96.85 I want to show Med and Max heights for each Year with each bar having a different color (or pattern) and a single x-axis year label. Trying to follow the example in ?barchart for a single variable produced this:> barchart('Year' ~ 'Med', data=stage_height, panel=lattice.getOption('panel.barchart'), default.prepanel=lattice.getOption('prepanel.default.barchart'),box.ratio=2)Error in eval(substitute(groups), data, environment(formula)) : invalid 'envir' argument of type 'closure' and no plot was displayed. I must be missing the obvious and want a pointer to descriptions that teach me how to produce bar charts. Rich
No reproducible example (see posting guide below) so minimal help. Remove the quotes from your formula. Why did you think they should be there? -- see ?formula. Read the relevant portions of ?xyplot carefully (again?). You seemed to have missed: "*Primary variables:* The x and y variables should both be numeric in xyplot, and an attempt is made to coerce them if not. However, if either is a factor, the levels of that factor are used as axis labels. In the other four functions documented here, [ which includes barchart()] **exactly one of x and y should be numeric, and the other a factor or shingle**. Which of these will happen is determined by the horizontal argument ? if horizontal=TRUE, then y will be coerced to be a factor or shingle, otherwise x. The default value of horizontal is FALSE if x is a factor or shingle, TRUEotherwise. (The functionality provided by horizontal=FALSE is not S-compatible.) So with the default ... horizontal = FALSE, Med would be treated as a factor, which I think is precisely the opposite of what you want. Here is a simple example to indicate how things work: y <- runif(5) x <- factor(letters[1:5]) barchart(y~x) As for fiddling with the colors and patterns of the bars -- generally a bad idea , especially fill patterns, btw -- see the "col" argument of ?panel.barchart, which is always where you should look for such info (i.e. panel.whatever). I don't know whether you can fool with fill patterns* -- it may depend on your graphics device -- but you can google around or see what trellis.par.get() has available (which can be specified in the "par.settings" argument list in the call). * For why fooling with fill patterns is a bad idea, google "moir? patterns". Cheers, Bert Bert Gunter "The trouble with having an open mind is that people keep coming along and sticking things into it." -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip ) On Wed, Aug 22, 2018 at 8:13 AM Rich Shepard <rshepard at appl-ecosys.com> wrote:> I've not before created bar charts, only scatter plots and box plots. > Checking in Deepayan's book, searching the web, and looking at ?barchart > has > not shown me the how to get the results I need. > > The dataframe looks like this: > > head(stage_heights) > Year Med Max > 1 1989 91.17 93.32 > 2 1990 91.22 93.43 > 3 1991 91.24 92.89 > 4 1993 91.14 93.02 > 5 1994 93.92 95.74 > 6 1995 94.34 96.85 > > I want to show Med and Max heights for each Year with each bar having a > different color (or pattern) and a single x-axis year label. > > Trying to follow the example in ?barchart for a single variable > produced this: > > > barchart('Year' ~ 'Med', data=stage_height, > panel=lattice.getOption('panel.barchart'), > default.prepanel=lattice.getOption('prepanel.default.barchart'),box.ratio=2) > Error in eval(substitute(groups), data, environment(formula)) : > invalid 'envir' argument of type 'closure' > and no plot was displayed. > > I must be missing the obvious and want a pointer to descriptions that > teach me how to produce bar charts. > > Rich > > ______________________________________________ > R-help at 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. >[[alternative HTML version deleted]]
On Wed, 22 Aug 2018, Bert Gunter wrote:> No reproducible example (see posting guide below) so minimal help.Hi Bert, I thought the header and six data rows of the dataframe plus the syntax of the command I used were sufficient. Regardless, here's the dput() output: structure(list(Year = c(1989L, 1990L, 1991L, 1993L, 1994L, 1995L, 1996L, 1997L, 1998L, 1999L, 2000L, 2001L, 2002L, 2003L, 2004L, 2005L, 2006L, 2007L, 2008L, 2009L, 2010L, 2011L, 2012L, 2013L, 2014L, 2015L, 2016L, 2017L, 2018L), Med = c(91.17, 91.22, 91.24, 91.14, 93.92, 94.34, 91.32, 91.36, 91.24, 94.33, 94.33, 94, 94.32, 94.02, 94.19, 94.05, 94.21, 94.21, 94.32, 94.13, 94.27, 94.34, 94.23, 94.25, 94.15, 94.01, 94.09, 94.31, 94.35), Max = c(93.32, 93.43, 92.89, 93.02, 95.74, 96.85, 95.86, 94.25, 93.67, 97.42, 97.42, 94.99, 96.58, 96.57, 96.32, 95.96, 97.4, 97.28, 96.72, 97.43, 95.95, 97.82, 97, 96.6, 96.24, 96.68, 96.96, 96.39, 96.95 )), class = "data.frame", row.names = c(NA, -29L))> Remove the quotes from your formula. Why did you think they should be > there? -- see ?formula.A prior attempt seemed to suggest the strings needed to be quoted.> Read the relevant portions of ?xyplot carefully (again?). You seemed to > have missed:I'm trying to create a barchart, not an xyplot.> y <- runif(5) > x <- factor(letters[1:5]) > barchart(y~x)Okay. I see one error in my command that's fixed here: barchart(stage_heights$Med ~ stage_heights$Year, horizontal=FALSE)> As for fiddling with the colors and patterns of the bars -- generally a bad > idea , especially fill patterns, btw -- see the "col" argument of > ?panel.barchart, which is always where you should look for such info (i.e. > panel.whatever). I don't know whether you can fool with fill patterns* -- > it may depend on your graphics device -- but you can google around or see > what trellis.par.get() has available (which can be specified in the > "par.settings" argument list in the call).I need pairs of bars, one each for Med and Max for each year. Color or pattern would distinguish the two.> * For why fooling with fill patterns is a bad idea, google "moir? patterns".I did not think that a solid fill or striped fill would create a moire pattern on either a computer screen viewing a .pdf file or on the printed page. Correcting the barchard() command fixed the main issue; getting the second set of bars is still eluding me, but I'll continue working on fixing this. I'll get the years as the x-axis labels rather than year number in sequence from 1 to 29. Thanks, Rich