[R] Arranging ggplot2 objects with ggplotGrob()

H @gent@ @end|ng |rom medd@t@|nc@com
Sat Jul 25 21:05:32 CEST 2020


On 07/25/2020 03:01 PM, Rui Barradas wrote:
> Hello,
>
> OK, now it's reproducible, thanks.
> align = "hv" works like I had suggested.
>
> The full code is now
>
> library(ggplot2)
> library(cowplot)
>
> s <- ggplot(data = subset(iris, Species == 'virginica'), aes(Sepal.Length, Sepal.Width)) + geom_point()
> v <- ggplot(data = subset(iris, Species == 'setosa'), aes(Sepal.Length, Sepal.Width * 1000)) + geom_point()
>
> cowplot::plot_grid(s, v, align = "hv", nrow = 2, rel_heights = 2:1)
>
>
> Also, I have been failing to comply to the posting guide and never posted the output of
>
> sessionInfo()
> R version 4.0.2 (2020-06-22)
> Platform: x86_64-w64-mingw32/x64 (64-bit)
> Running under: Windows 10 x64 (build 18362)
>
> Matrix products: default
>
> locale:
> [1] LC_COLLATE=Portuguese_Portugal.1252 LC_CTYPE=Portuguese_Portugal.1252
> [3] LC_MONETARY=Portuguese_Portugal.1252 LC_NUMERIC=C
> [5] LC_TIME=Portuguese_Portugal.1252
>
> attached base packages:
> [1] stats     graphics  grDevices utils     datasets  methods base
>
> other attached packages:
> [1] cowplot_1.0.0 ggplot2_3.3.2 tidyr_1.1.0   dplyr_1.0.0 sos_2.0-0
> [6] brew_1.0-6
>
> loaded via a namespace (and not attached):
>  [1] Rcpp_1.0.4.6     magrittr_1.5     tidyselect_1.1.0 munsell_0.5.0
>  [5] colorspace_1.4-1 R6_2.4.1         rlang_0.4.6 fansi_0.4.1
>  [9] tools_4.0.2      grid_4.0.2       gtable_0.3.0 utf8_1.1.4
> [13] cli_2.0.2        withr_2.2.0      ellipsis_0.3.1 digest_0.6.25
> [17] assertthat_0.2.1 tibble_3.0.1     lifecycle_0.2.0 crayon_1.3.4
> [21] farver_2.0.3     purrr_0.3.4      vctrs_0.3.1 glue_1.4.1
> [25] labeling_0.3     compiler_4.0.2   pillar_1.4.4 generics_0.0.2
> [29] scales_1.1.1     pkgconfig_2.0.3
>
>
> Hope this helps,
>
> Rui Barradas
>
> Às 19:13 de 25/07/2020, H escreveu:
>> On 07/25/2020 12:36 PM, Rui Barradas wrote:
>>> Hello,
>>>
>>> Inline.
>>>
>>> Às 16:54 de 25/07/2020, H escreveu:
>>>> On 07/24/2020 05:56 PM, Rui Barradas wrote:
>>>>> Hello,
>>>>>
>>>>> I've just tried it.
>>>>>
>>>>> library(ggplot2)
>>>>> #library(grid)
>>>>> library(cowplot)
>>>>>
>>>>> s <- ggplot(data = subset(iris, Species == 'virginica'), aes(Sepal.Length, Sepal.Width)) + geom_point()
>>>>> v <- ggplot(data = subset(iris, Species == 'setosa'), aes(Sepal.Length, Sepal.Width)) + geom_point()
>>>>>
>>>>> #g2 <- ggplotGrob(s)
>>>>> #g3 <- ggplotGrob(v)
>>>>> #g <- rbind(g2, g3, size = "first")
>>>>>
>>>>> cowplot::plot_grid(s, v, align = "h", nrow = 2, rel_heights = 2:1)
>>>>>
>>>>>
>>>>> Hope this helps,
>>>>>
>>>>> Rui Barradas
>>>>>
>>>>> Às 19:57 de 24/07/2020, Felipe Carrillo via R-help escreveu:
>>>>>> What about cowplot?
>>>>>> https://cran.r-project.org/web/packages/cowplot/vignettes/introduction.html
>>>>>>
>>>>>>        On Friday, July 24, 2020, 11:51:17 AM PDT, H <agents using meddatainc.com> wrote:
>>>>>>       On 07/24/2020 02:03 PM, Jeff Newmiller wrote:
>>>>>>> The set of people interested in helping when you supply a minimal reproducible example is rather larger than the set of people willing to read the documentation for you (hint) and guess what aspect of alignment you are having trouble with.
>>>>>>>
>>>>>>> On July 24, 2020 10:46:57 AM PDT, H <agents using meddatainc.com> wrote:
>>>>>>>> On 07/24/2020 01:14 PM, John Kane wrote:
>>>>>>>>> <i>Well, I am not looking for help debugging my code but for
>>>>>>>> information to better understand arranging plots vertically. The code
>>>>>>>> above aligns them horizontally as expected.</i>
>>>>>>>>> Sigh, we know the code works but we do not know what the plots are
>>>>>>>> and we cannot play around with them to see if we can help you if we
>>>>>>>> have nothing to work with.
>>>>>>>>> On Fri, 24 Jul 2020 at 12:12, H <agents using meddatainc.com
>>>>>>>> <mailto:agents using meddatainc.com>> wrote:
>>>>>>>>>        On 07/24/2020 05:29 AM, Erich Subscriptions wrote:
>>>>>>>>>        > Hav a look at the packages cowplot and patchwork
>>>>>>>>>        >
>>>>>>>>>        >> On 24.07.2020, at 02:36, H <agents using meddatainc.com
>>>>>>>> <mailto:agents using meddatainc.com>> wrote:
>>>>>>>>>        >>
>>>>>>>>>        >> I am trying to arrange two plots vertically, ie plot 2 below
>>>>>>>> plot 1, where I want the plots to align columnwise but have a height
>>>>>>>> ratio of eg 3:1.
>>>>>>>>>        >>
>>>>>>>>>        >> My attempts so far after consulting various webpages is that
>>>>>>>> the following code aligns them columnwise correctly but I have, so far,
>>>>>>>> failed in setting the relative heights...
>>>>>>>>>        >>
>>>>>>>>>        >> g2<-ggplotGrob(s)
>>>>>>>>>        >> g3<-ggplotGrob(v)
>>>>>>>>>        >> g<-rbind(g2, g3, size = "first")
>>>>>>>>>        >> g$widths<-unit.pmax(g2$widths, g3$widths)
>>>>>>>>>        >>
>>>>>>>>>        >> what would the appropriate statement for the relative heights
>>>>>>>> to add here be?
>>>>>>>>>        >>
>>>>>>>>>        >> grid.newpage()
>>>>>>>>>        >> grid.draw(g)
>>>>>>>>>        >>
>>>>>>>>>        >> Thank you!
>>>>>>>>>        >>
>>>>>>>>>        >> ______________________________________________
>>>>>>>>>        >> R-help using r-project.org <mailto:R-help using 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.
>>>>>>>>>        So this is not possible without using one of those two packages?
>>>>>>>> I got the impression I should be able to use grid.arrange to do so but
>>>>>>>> was not able to get it to work without disturbing the width alignment
>>>>>>>> above...
>>>>>>>>>        ______________________________________________
>>>>>>>>>        R-help using r-project.org <mailto:R-help using 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.
>>>>>>>>> -- 
>>>>>>>>> John Kane
>>>>>>>>> Kingston ON Canada
>>>>>>>> No need to play around with anything. I am simply looking for
>>>>>>>> assistance on how to use eg arrangeGrob to not only align two plots
>>>>>>>> columnwise but also adjust their heights relative to each other rather
>>>>>>>> than 1:1.
>>>>>>>>
>>>>>>>> Can arrangeGrob() be used for that?
>>>>>>>>
>>>>>>>>
>>>>>>>>        [[alternative HTML version deleted]]
>>>>>>>>
>>>>>>>> ______________________________________________
>>>>>>>> R-help using 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.
>>>>>> Look at https://cran.r-project.org/web/packages/egg/vignettes/Ecosystem.html where there are two mpg charts, one above the other. What would I need to add to:
>>>>>>
>>>>>> |library(gtable) g2 <-ggplotGrob(p2) g3 <-ggplotGrob(p3) g <-rbind(g2, g3, size = "first") g$widths <-unit.pmax(g2$widths, g3$widths) grid.newpage() grid.draw(g) |
>>>>>>
>>>>>> |to make the second chart 1/2 the size of the top one?|
>>>>>>
>>>>>> ||
>>>>>>
>>>>>>
>>>>>>        [[alternative HTML version deleted]]
>>>>>>
>>>>>> ______________________________________________
>>>>>> R-help using 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]]
>>>>>>
>>>>>> ______________________________________________
>>>>>> R-help using 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.
>>>> Thank you for your example. However, this does not align the plot areas horizontally. It happens to do so in this example because the y-axis labels are the same length etc but when this is not the case, it fails.
>>> Maybe it fails but can you give an example?
>>> The question, as far as I understand it, is about the plots' relative heights, not about horizontal alignment. And (all) others have asked you to give a reproducible example, please don't ask us to guess a use case axis labels lengths (!), which is impossible to do.
>>>
>>> Anyway, the function cowplot::plot_grid has an argument `align`. One of the possible values is "hv" for both horizontal and vertical alignment.
>>>
>>> Hope this helps,
>>>
>>> Rui Barradas
>>>
>>>> ______________________________________________
>>>> R-help using 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.
>>>
>> The easiest demonstration would be to replace:
>>
>> v <- ggplot(data = subset(iris, Species == 'setosa'), aes(Sepal.Length, Sepal.Width)) + geom_point()
>>
>> with:
>>
>> v <- ggplot(data = subset(iris, Species == 'setosa'), aes(Sepal.Length, Sepal.Width * 1000)) + geom_point()
>>
>> I am looking to not only being able to set relative heights of rows (as your code correctly does) but also have the plot areas aligned.
>>
>> ______________________________________________
>> R-help using 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.
>
>
Just tried it and it works in this example, however, with my two plots where the top plot does not have an x-axis legend the code above still reserves room for the legend which now shows up as a large empty space...

This is harder than I thought. I wonder if going back to the grobs would offer a better solution? The problem is that diving into the underlying code and understanding which variables to change is hard, there are /lots/ of variables...



More information about the R-help mailing list