[R] ggarrange & legend

Paul Murrell p@u| @end|ng |rom @t@t@@uck|@nd@@c@nz
Tue Feb 6 21:28:38 CET 2024


Hi

Using John's example ...


data("ToothGrowth")
df <-ToothGrowth
df$dose <- as.factor(df$dose)
## Box plot
bxp <- ggboxplot(df, x = "dose", y = "len",
	         color = "dose", palette = "jco")
## Density plot
dens <- ggdensity(df, x = "len", fill = "dose", palette = "jco")
mylist<-list(bxp, dens)
dev.new(width=28, height=18)
fig1<- ggarrange(plotlist=mylist, common.legend = TRUE,
                  legend="top",
                  labels = c("(A)", "(B)"),
                  font.label = list(size = 18, color = "black"), ncol=2)
fig1


... the problem is that even though 'ggplot2' allows a numeric 'legend'
(although this result is probably not what you want anyway) ...


bxp + theme(legend.position=c(1, 1))


... ggpubr::ggarrange() passes the 'legend' on to ggpubr:::.plot_grid(),
which does an explicit switch(legend), which fails ...


try(ggarrange(plotlist=mylist, common.legend = TRUE,
               legend=c(1, 1),
               labels = c("(A)", "(B)"),
               font.label = list(size = 18, color = "black"), ncol=2))


One option is to extract the legend
('position' will affect orientation of legend?) ...


legend <- ggpubr::get_legend(bxp, position="top")


... and then draw the legend yourself (in the top-right corner)
and tell ggarange() NOT to draw the legend ...


library(grid)
h <- sum(legend$height)
w <- sum(legend$width)
combined <- ggarrange(plotlist=mylist, common.legend = TRUE,
                       legend="none",
                       labels = c("(A)", "(B)"),
                       font.label = list(size = 18, color = "black"),
                       ncol=2)
grid.newpage()
pushViewport(viewport(y=1, height=h,
                       x=1, width=w,
                       just=c("right", "top")))
grid.draw(legend)
popViewport()
pushViewport(viewport(y=0, height=unit(1, "npc") - h, just="bottom"))
print(combined, newpage=FALSE)
popViewport()


Is that what you were looking for?

Paul


On 6/02/24 03:22, John Kane wrote:
> Blast it hit send by accident. Anyway the code above is a WWE.
> 
> I don't see any obvious way no move the legend
> 
> 
> On Mon, 5 Feb 2024 at 09:13, John Kane <jrkrideau using gmail.com> wrote:
> 
>  > I'm sorry but that is not a working example.
>  >
>  > A working example needs to create the plots being used.
>  >
>  > For example, stealing some code from
>  > https://rpkgs.datanovia.com/ggpubr/reference/ggarrange.html 
> <https://rpkgs.datanovia.com/ggpubr/reference/ggarrange.html>
>  > #=================================================================
>  >
>  > data <https://rdrr.io/r/utils/data.html 
> <https://rdrr.io/r/utils/data.html>>("ToothGrowth")df <- ToothGrowthdf$dose <- as.factor <https://rdrr.io/r/base/factor.html <https://rdrr.io/r/base/factor.html>>(df$dose)# Box plotbxp <- ggboxplot <https://rpkgs.datanovia.com/ggpubr/reference/ggboxplot.html <https://rpkgs.datanovia.com/ggpubr/reference/ggboxplot.html>>(df, x = "dose", y = "len", color = "dose", palette = "jco")# Density plotdens <- ggdensity <https://rpkgs.datanovia.com/ggpubr/reference/ggdensity.html <https://rpkgs.datanovia.com/ggpubr/reference/ggdensity.html>>(df, x = "len", fill = "dose", palette = "jco")
>  >
>  > mylist<-list(bxp, dens)
>  >
>  > dev.new(width=28, height=18)
>  >
>  > fig1<- ggarrange(plotlist=mylist, common.legend = TRUE, legend="top", 
> labels = c("(A)", "(B)"), font.label = list(size = 18, color = "black"), 
> ncol=2)
>  >
>  > fig1
>  > 
> #=====================================================================================
>  >
>  >
>  > On Mon, 5 Feb 2024 at 08:44, <sibylle.stoeckli using gmx.ch> wrote:
>  >
>  >> Dear John Kane
>  >>
>  >> Dear R community
>  >>
>  >>
>  >>
>  >> Here my working example
>  >>
>  >> 1. Example that is working with legend=”top”. However, as mentioned,
>  >> the legend is in the middle of the top axis.
>  >>
>  >> mylist<-list(p1, p2)
>  >>
>  >> dev.new(width=28, height=18)
>  >>
>  >> fig1<- ggarrange(plotlist=mylist, common.legend = TRUE, legend="top",
>  >> labels = c("(A)", "(B)"), font.label = list(size = 18, color = "black"),
>  >> ncol=2)
>  >>
>  >> fig1
>  >>
>  >>
>  >>
>  >> 1. My question is how I can position the legend on the topright of
>  >> the top axis. However, “topright” is not a common label for legend in
>  >> ggarrange (but in other plot functions), so legend =”topright” is not
>  >> working.
>  >>
>  >> mylist<-list(p1, p2)
>  >>
>  >> dev.new(width=28, height=18)
>  >>
>  >> fig1<- ggarrange(plotlist=mylist, common.legend = TRUE,
>  >> legend="topright", labels = c("(A)", "(B)"), font.label = list(size 
> = 18,
>  >> color = "black"), ncol=2)
>  >>
>  >> fig1
>  >>
>  >>
>  >>
>  >> Kind regards
>  >>
>  >> Sibylle
>  >>
>  >>
>  >>
>  >> *From:* John Kane <jrkrideau using gmail.com>
>  >> *Sent:* Monday, February 5, 2024 1:59 PM
>  >> *To:* sibylle.stoeckli using gmx.ch
>  >> *Cc:* r-help using r-project.org
>  >> *Subject:* Re: [R] ggarrange & legend
>  >>
>  >>
>  >>
>  >> Could you supply us with a MWE (minimal working example)of what you have
>  >> so far?
>  >>
>  >> Thanks.
>  >>
>  >>
>  >>
>  >> On Mon, 5 Feb 2024 at 05:00, SIBYLLE STÖCKLI via R-help <
>  >> r-help using r-project.org> wrote:
>  >>
>  >> Dear R community
>  >>
>  >> It is possible to adjust the legend in combined ggplots using ggarrange
>  >> with
>  >> be positions top, bottom, left and right.
>  >> My question: Is there a function to change the position of the legend to
>  >> topright or bottomleft? Right and top etc are in the middle of the axis.
>  >>
>  >> Kind regards
>  >> Sibylle
>  >>
>  >> ______________________________________________
>  >> R-help using 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.
>  >>
>  >>
>  >>
>  >> --
>  >>
>  >> John Kane
>  >> Kingston ON Canada
>  >>
>  >
>  >
>  > --
>  > John Kane
>  > Kingston ON Canada
>  >
> 
> 
> -- 
> John Kane
> Kingston ON Canada
> 
> [[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 
> <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.

-- 
Dr Paul Murrell
Te Kura Tatauranga | Department of Statistics
Waipapa Taumata Rau | The University of Auckland
Private Bag 92019, Auckland 1142, New Zealand
64 9 3737599 x85392
paul using stat.auckland.ac.nz
www.stat.auckland.ac.nz/~paul/



More information about the R-help mailing list