[R] How to rotate only one panel by 90 degrees in R plot?

Luigi Marongiu m@rong|u@|u|g| @end|ng |rom gm@||@com
Wed Oct 13 12:04:14 CEST 2021


Thank you!

On Wed, Oct 13, 2021 at 12:00 PM Deepayan Sarkar
<deepayan.sarkar using gmail.com> wrote:
>
> On Wed, Oct 13, 2021 at 12:13 PM Luigi Marongiu
> <marongiu.luigi using gmail.com> wrote:
> >
> > I have seen that the only package that easily rotate the plot is
> > ggplot, so I ran:
> > ```
> > library(ggplot2)
> > df = data.frame(MR = c(negative_mr, uncertain_mr, positive_mr),
> > FCN = c(negative_fcn, uncertain_fcn, positive_fcn))
> > p <- ggplot(df, aes(x=MR)) +
> > geom_density()
> > p + coord_flip()
> > ```
> > Even in this case, the plot is correctly rotated, but I can't place it
> > in the allocated panel. ggplot2 simply overwrites the whole plot. This
> > means I need to do the whole thing in ggplot2 (would lattice have an
> > equivalent?) and split the plot into uneven panels with ggplot2.
> > Changing x into y is a clever approach, but it is not the same as
> > rotating a plot. But YES, that is exactly what I wanted to plot. Thank
> > you!
>
> Well, traditional R graphics (as well as lattice) requires a more DIY
> approach. As Paul already indicated, you need to control what you are
> plotting instead of relying on plot(density(...)) doing the right
> thing.
>
> Modifying your original code:
>
> ```
> layout(matrix(c(1,2),nrow=1), widths=c(3,1)) # split panels unevenly
>
> plot(negative_x, negative_y, ylim=c(0,0.5), xlim=c(0,41), cex=1.5,
>      xlab=expression(bold("X")),
>      ylab=expression(bold("Y")))
> points(positive_x, positive_y, pch=16, cex=1.5)
> points(uncertain_x, uncertain_y, pch=16, cex=1.5, col="grey")
> legend("topleft",
>        legend = c("Positives", "Negatives", "Uncertains"),
>        pch = c(16, 1, 16), col=c("black", "black", "grey"), cex=0.8)
>
> ## calculate density (but don't plot yet)
> d <- density(c(negative_y, uncertain_y, positive_y))
>
> ## Your original code is equivalent to this
> ## plot(d,
> ##      yaxt="n", xaxt="n", main=NA, ylab=NA, xlab=NA)
>
> plot(d$y, d$x, type = "l",
>      ##yaxt="n",
>      xaxt="n", main=NA, ylab=NA, xlab=NA)
> ```
>
> Note that in the last plot, I have plot(d$y, d$x, ...) instead of
> plot(d$x, d$y, ...).
>
> I have commented out your yaxt="n" to highlight something that may not
> be initially obvious, which is that the axis limits of your two plots
> do not match. To ensure that, you would additionally need to match
> ylim:
>
> ```
> plot(d$y, d$x, type = "l", ylim=c(0,0.5),
>      yaxt="n", xaxt="n", main=NA, ylab=NA, xlab=NA)
> ```
>
> Best,
> -Deepayan
>
> > On Wed, Oct 13, 2021 at 1:17 AM Bert Gunter <bgunter.4567 using gmail.com> wrote:
> > >
> > > I don't know the gridGraphics package, and I haven't looked closely at what you are trying to do. But note that lattice functions construct grid "grobs" that can be saved and plotted in arbitrary, including rotated, viewports, using the print.trellis function. I frankly am pretty ignorant about such things, but this simple little example might give you some notion of how to proceed. You may also be able to do what you want with grid.layout() and pushing a suitably rotated viewport onto a layout. Others would have to advise on such details, if so.
> > >
> > > If I'm wrong and this is useless, just ignore without comment.
> > >
> > >
> > >
> > > dp <- densityplot(~y, main = "",
> > >                   xlab = "", ylab = "")
> > > grid.newpage()
> > > pushViewport(
> > >    viewport(width = unit(.5,"npc"),
> > >             height = unit(.3,"npc"),
> > >             angle = 270))
> > > print(dp, newp = FALSE,  ## this is the print.trellis method
> > >       panel.width = list(1,"npc"),
> > >       panel.height = list(1, "npc")
> > > )
> > >
> > > 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 Tue, Oct 12, 2021 at 1:43 PM Luigi Marongiu <marongiu.luigi using gmail.com> wrote:
> > >>
> > >> Hello,
> > >> I would like to show a density plot of the Y axis. To do that, I would
> > >> like to split the plot into a panel 2/3 long and a density plot 1/3
> > >> long. The problem is that, since the density is on the Y axis, the
> > >> density plot should be rotated byb90 degrees. I tried with the package
> > >> gridGraphics but it rotates both panels.
> > >> ```
> > >> negative_y <- runif(50, 0, 0.099)
> > >> negative_x <- runif(50, 1, 40)
> > >> positive_y <- c(runif(30, 0.2, 0.5), runif(20, 0.4, 0.5))
> > >> positive_x <- c(runif(30, 25, 40), runif(20, 10, 25))
> > >> uncertain_y <- runif(10, 0.099, 0.2)
> > >> uncertain_x <- runif(10, 2, 40)
> > >> # plot on MR/FCN space
> > >> layout(matrix(c(1,2),nrow=1), widths=c(3,1)) # split panels unevenly
> > >> plot(negative_x, negative_y, ylim=c(0,0.5), xlim=c(0,41), cex=1.5,
> > >> xlab=expression(bold("X")),
> > >> ylab=expression(bold("Y")))
> > >> points(positive_x, positive_y, pch=16, cex=1.5)
> > >> points(uncertain_x, uncertain_y, pch=16, cex=1.5, col="grey")
> > >> legend("topleft",
> > >> legend = c("Positives", "Negatives", "Uncertains"),
> > >> pch = c(16, 1, 16), col=c("black", "black", "grey"), cex=0.8)
> > >> # plot density
> > >> plot(density(c(negative_y, uncertain_y, positive_y)),
> > >> yaxt="n", xaxt="n", main=NA, ylab=NA, xlab=NA)
> > >> library(gridGraphics)
> > >> grab_grob <- function(){
> > >> grid.echo()
> > >> grid.grab()
> > >> }
> > >> g <- grab_grob()
> > >> grid.newpage()
> > >> pushViewport(viewport(width=0.7,angle=270))
> > >> grid.draw(g)
> > >> ```
> > >> How can I rotate only the second panel? I tried to assign the second
> > >> plot to an object p and then call grid.draw(p), or to assign g to the
> > >> second plot, but they did not work...
> > >> Thanks
> > >>
> > >>
> > >> --
> > >> Best regards,
> > >> Luigi
> > >>
> > >> ______________________________________________
> > >> 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.
> >
> >
> >
> > --
> > Best regards,
> > Luigi
> >
> > ______________________________________________
> > 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.



-- 
Best regards,
Luigi



More information about the R-help mailing list