Rotate entire ggplot() without rotating any text R

2020-04-08 14:49发布

问题:

I am looking to rotate the entire plot, axis and all, but keeping the axis labels and title how they are so they can be read horizontally.

library(ggplot2)
data(mtcars)

ggplot() + geom_point(data=mtcars,aes(x=mpg,y=cyl)) + 
  labs(title = "MPG vs Cylinders",
       x = "", y = "") + 
  theme(plot.title = element_text(size=40),axis.text.x=element_text(size=35),axis.text.y=element_text(size=35))

So the plot that this code generated would ideally be rotated 30 degrees or so counter-clockwise like so:

But the title should still be displayed horizontal, instead of with a 30 degree turn. Same with the axis labels (I put the plot in MS word and rotated it with the little green circle). Any thoughts? Is it even possible?

回答1:

Would this work for you (code below)

# install.packages("ggplot2", dependencies = TRUE)
library(ggplot2)

rotation <- 30

p <- ggplot() + geom_point(data=mtcars,aes(x=mpg,y=cyl)) + labs(title = "MPG vs Cylinders", x = "", y = "") + theme(plot.title = element_text(size=20), axis.text.x=element_text(size=15),axis.text.y=element_text(size=15)) + theme(text = element_text(angle=(-1*rotation))) 

# install.packages("grid", dependencies = TRUE)
library(grid)
print(p, vp=viewport(angle=rotation,  width = unit(.75, "npc"), height = unit(.75, "npc")))


回答2:

This gives some warnings, but works:

library(ggplot2)
library(grid)

data(mtcars)
grid.newpage()
pushViewport(viewport(angle = -30))
grid.draw(ggplotGrob(
  ggplot() + geom_point(data = mtcars,aes(x = mpg,y = cyl)) +
    labs(title = "MPG vs Cylinders",
         x = "", y = "") +
    theme(text = element_text(angle = 30),
          plot.margin = unit(c(0.07, 0.08, 0.2, 0.04), "npc"))
))

Fine tune as needed.