[R] Arranging ggplot2 objects with ggplotGrob()

H @gent@ @end|ng |rom medd@t@|nc@com
Sun Jul 26 21:34:21 CEST 2020


On 07/25/2020 03:05 PM, H wrote:
> 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...
>
Returning to this problem. Given the plots below where the plot areas are now nicely aligned, is it possible to change the heights to eg relative heights being 2:1?

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()
g2<-ggplotGrob(s)
g3<-ggplotGrob(v)
g<-rbind(g2, g3, size = "first")
g$widths<-unit.pmax(g2$widths, g3$widths)
grid.newpage()
grid.draw(



More information about the R-help mailing list