[R] Split charts with ggplot2, tidyquant

Charlie Redmon redmonc at gmail.com
Sun Jan 21 17:45:39 CET 2018


Thanks for the reminder about lattice! I did some searching and there's 
a good example of manipulating the size of subplots using the `position` 
argument (see pp. 202-203 in the Trellis Users Guide: 
http://ml.stat.purdue.edu/stat695t/writings/Trellis.User.pdf). This is 
not within the paneling environment with the headers like in other 
trellis plots though, so you'll have to do a bit more digging to see how 
to get that to work if you need those headers.


Best,

Charlie


On 01/20/2018 03:17 PM, Bert Gunter wrote:
> That (the need for base graphics) is false. It certainly **can** be 
> done in base graphics -- see ?layout for a perhaps more 
> straightforward way to do it along the lines you suggest.
>
> However both lattice and ggplot are based on grid graphics, which has 
> a similar but slightly more flexible ?grid.layout function which would 
> allow one to size and place subsequent ggplot or lattice graphs in an 
> arbitrary layout as you have described (iiuc) for the base graphics case.
>
> Perhaps even simpler would be to use the "position" argument of the 
> print.trellis() function to locate trellis plots. Maybe ggplot() has 
> something similar.
>
> In any case, the underlying grid graphics functionality allows 
> **much** greater fine control of graphical elements (including 
> rotation, for example) -- at the cost of greater complexity. I would 
> agree that doing it from scratch using base grid functions is most 
> likely overkill here, though. But it's there.
>
> IMHO only, the base graphics system was great in its time, but its 
> time has passed. Grid graphics is much more powerful because it is 
> objects based -- that is, grid graphs are objects that can be saved, 
> modified, and even interacted with in flexible ways. Lattice and 
> ggplot incarnations take advantage of this, giving them more power and 
> flexibility than the base graphics capabilities can muster.
>
> I repeat -- IMHO only! Feel free to disagree. I don't want to start 
> any flame wars here.
>
> 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 Sat, Jan 20, 2018 at 12:19 PM, Charlie Redmon <redmonc at gmail.com 
> <mailto:redmonc at gmail.com>> wrote:
>
>     For this kind of control you will probably need to move to base
>     graphics
>     and utilize the `fig` argument in par(), in which case you would
>     want to
>     run the plot() command twice: once with your first outcome and
>     once with
>     your second, changing the par() settings before each one to
>     control the
>     size.
>
>
>     On 01/19/2018 01:39 PM, Eric Berger wrote:
>     > Hi Charlie,
>     > Thanks. This is helpful. As mentioned in my original question, I
>     want
>     > to be able to plot a few such charts on the same page,
>     > say a 2 x 2 grid with such a chart for each of 4 different stocks.
>     > Using your solution I accomplished this by making
>     > a list pLst of your ggplots and then calling cowplot::plot_grid(
>     > plotlist=pLst, nrow=2, ncol=2 )  That worked fine.
>     >
>     > The one issue  I have is that in the ggplot you suggest, the
>     price and
>     > volume facets are the same size. I would like them to be
>     different sizes
>     > (e.g. the volume facet at the bottom is generally shown smaller than
>     > the facet above it in these types of charts.)
>     >
>     > I tried to find out how to do it but didn't succeed. I found a
>     couple
>     > of relevant discussions (including Hadley writing that he did not
>     > think it was a useful feature. :-()
>     >
>     > https://github.com/tidyverse/ggplot2/issues/566
>     <https://github.com/tidyverse/ggplot2/issues/566>
>     >
>     > and an ancient one where someone seems to have been able to get a
>     > heights parameter working in a call to facet_grid but it did not
>     work
>     > for me.
>     >
>     https://kohske.wordpress.com/2010/12/25/adjusting-the-relative-space-of-a-facet-grid/
>     <https://kohske.wordpress.com/2010/12/25/adjusting-the-relative-space-of-a-facet-grid/>
>     >
>     > Thanks again,
>     > Eric
>     >
>     > p.s. Joshua thanks for your suggestions, but I was hoping for a
>     ggplot
>     > solution.
>     >
>     >
>     > On Fri, Jan 19, 2018 at 6:33 PM, Charlie Redmon
>     <redmonc at gmail.com <mailto:redmonc at gmail.com>
>     > <mailto:redmonc at gmail.com <mailto:redmonc at gmail.com>>> wrote:
>     >
>     >     So the general strategy for getting these into separate
>     panels in
>     >     ggplot is to have a single variable that will be your
>     response and
>     >     a factor variable that indexes which original variable it came
>     >     from. This can be accomplished in many ways, but the way I
>     use is
>     >     with the melt() function in the reshape2 package.
>     >     For example,
>     >
>     >     library(reshape2)
>     >     plotDF <- melt(SPYdf,
>     >                             id.vars="Date", # variables to replicate
>     >                             measure.vars=c("close", "volume"), #
>     >     variables to create index from
>     > variable.name <http://variable.name>
>     <http://variable.name>="parameter", # name of new
>     >     variable for index
>     > value.name <http://value.name> <http://value.name>="resp") #
>     name of what will be your
>     >     response variable
>     >
>     >     Now the ggplot2 code:
>     >
>     >     library(ggplot2)
>     >     ggplot(plotDF, aes(x=Date, y=resp)) +
>     >         facet_wrap(~parameter, ncol=1, scales="free") +
>     >         geom_line()
>     >
>     >
>     >     Hope that does the trick!
>     >
>     >     Charlie
>     >
>     >
>     >
>     >     On 01/18/2018 02:11 PM, Eric Berger wrote:
>     >
>     >         Hi Charlie,
>     >         I am comfortable to put the data in any way that works best.
>     >         Here are two possibilities: an xts and a data frame.
>     >
>     >         library(quantmod)
>     >         quantmod::getSymbols("SPY")  # creates xts variable SPY
>     >         SPYxts <- SPY[,c("SPY.Close","SPY.Volume")]
>     >         SPYdf  <-
>     >       
>      data.frame(Date=index(SPYxts),close=as.numeric(SPYxts$SPY.Close),
>     >          volume=as.numeric(SPYxts$SPY.Volume))
>     >         rownames(SPYdf) <- NULL
>     >
>     >         head(SPYxts)
>     >         head(SPYdf)
>     >
>     >         #           SPY.Close SPY.Volume
>     >         #2007-01-03    141.37   94807600
>     >         #2007-01-04    141.67   69620600
>     >         #2007-01-05    140.54   76645300
>     >         #2007-01-08    141.19   71655000
>     >         #2007-01-09    141.07   75680100
>     <tel:07%C2%A0%20%C2%A075680100>
>     >         #2007-01-10    141.54   72428000
>     >
>     >         #        Date  close   volume
>     >         #1 2007-01-03 141.37 94807600
>     >         #2 2007-01-04 141.67 69620600
>     >         #3 2007-01-05 140.54 76645300
>     >         #4 2007-01-08 141.19 71655000
>     >         #5 2007-01-09 141.07 75680100 <tel:07%2075680100>
>     >         #6 2007-01-10 141.54 72428000
>     >
>     >         Thanks,
>     >         Eric
>     >
>     >
>     >
>     >         On Thu, Jan 18, 2018 at 8:00 PM, Charlie Redmon
>     >         <redmonc at gmail.com <mailto:redmonc at gmail.com>
>     <mailto:redmonc at gmail.com <mailto:redmonc at gmail.com>>
>     >         <mailto:redmonc at gmail.com <mailto:redmonc at gmail.com>
>     <mailto:redmonc at gmail.com <mailto:redmonc at gmail.com>>>> wrote:
>     >
>     >             Could you provide some information on your data
>     structure
>     >         (e.g.,
>     >             are the two time series in separate columns in the
>     data)? The
>     >             solution is fairly straightforward once you have the
>     data
>     >         in the
>     >             right structure. And I do not think tidyquant is
>     necessary for
>     >             what you want.
>     >
>     >             Best,
>     >             Charlie
>     >
>     >             --     Charles Redmon
>     >             GRA, Center for Research Methods and Data Analysis
>     >             PhD Student, Department of Linguistics
>     >             University of Kansas
>     >             Lawrence, KS, USA
>     >
>     >
>     >
>     >     --
>     >     Charles Redmon
>     >     GRA, Center for Research Methods and Data Analysis
>     >     PhD Student, Department of Linguistics
>     >     University of Kansas
>     >     Lawrence, KS, USA
>     >
>     >
>
>     --
>     Charles Redmon
>     GRA, Center for Research Methods and Data Analysis
>     PhD Student, Department of Linguistics
>     University of Kansas
>     Lawrence, KS, USA
>
>
>             [[alternative HTML version deleted]]
>
>     ______________________________________________
>     R-help at r-project.org <mailto:R-help at r-project.org> mailing list --
>     To UNSUBSCRIBE and more, see
>     https://stat.ethz.ch/mailman/listinfo/r-help
>     <https://stat.ethz.ch/mailman/listinfo/r-help>
>     PLEASE do read the posting guide
>     http://www.R-project.org/posting-guide.html
>     <http://www.R-project.org/posting-guide.html>
>     and provide commented, minimal, self-contained, reproducible code.
>
>

-- 
Charles Redmon
GRA, Center for Research Methods and Data Analysis
PhD Student, Department of Linguistics
University of Kansas
Lawrence, KS, USA



More information about the R-help mailing list