ggplot2 multiline title, different indentations

前端 未结 5 674
失恋的感觉
失恋的感觉 2021-01-01 00:25

I am generating graphs for a publication and I\'d like to be able to label the panels of a figure in ggplot itself (as opposed to exporting to publisher, etc) so that they j

相关标签:
5条回答
  • 2021-01-01 00:57

    Update: Since ggplot2 3.0.0 there is now native support for plot labels, see this answer.

    Here is how I would do it, using the cowplot package that I wrote specifically for this purpose. Note that you get a clean theme as a bonus.

    library(cowplot)
    
    p <- ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species, shape = Species)) +
      geom_jitter(size = 3.5) +
      ggtitle("The Actual Long, Normal Title of Titliness")
    
    # add one label to one plot
    ggdraw(p) + draw_plot_label("A")
    

    # place multiple plots into a grid, with labels
    plot_grid(p, p, p, p, labels = "AUTO")
    

    You then want to use the save_plot function to save plots instead of ggsave, because save_plot has defaults and parameters that help you get the scaling right relative to the theme, in particular for plots in a grid.

    0 讨论(0)
  • 2021-01-01 01:07

    The easiest way is probably to use a title and a subtitle,

    ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species, shape = Species))+
      geom_jitter(size = 6.5) +
      labs(title = "A", subtitle = "The Actual Long, Normal Title of Titliness") +
      theme(plot.subtitle = element_text(hjust = 0.5))
    
    0 讨论(0)
  • 2021-01-01 01:15

    You can use grid.text from package grid, add text to your plot. Firstly add some space above your title use plot.margin.

    library(grid)
    p <- ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species, shape = Species))+
    geom_jitter(size = 6.5)+
    ggtitle("The Actual Long, Normal Title of Titliness")+
    theme(plot.title = element_text(hjust = 0,face = "bold", size = 30),
          axis.ticks = element_blank(),
          legend.text = element_text(size = 25),
          axis.title = element_text(size = 25, face = "bold"),
          axis.text = element_text(size = 25, vjust = 0.05),
          legend.position = "bottom", 
          plot.margin = unit(c(4, 3, 1, 1), "lines"))
    p
    grid.text('A', x = unit(0.1, 'npc'), y = unit(.90, 'npc'), gp = gpar(fontsize=28))
    

    0 讨论(0)
  • 2021-01-01 01:17

    You can do this by manipulating Grobs. Using gtable and grid on top of ggplot2.

    library("ggplot2")
    library("gtable")
    library("grid")
    
    p <- ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species, shape = Species))+
      geom_jitter(size = 6.5)+
      ggtitle("The Actual Long, Normal Title of Titliness")+
      theme(plot.title = element_text(hjust = 0.5, face = "bold", size = 30),
            axis.ticks = element_blank(),
            legend.text = element_text(size = 25),
            axis.title = element_text(size = 25, face = "bold"),
            axis.text = element_text(size = 25, vjust = 0.05),
            legend.position = "bottom",
            plot.margin = unit(c(4, 1, 1, 4), "lines"))  # We need bigger top/left margins to show the letter
    
    gt <- ggplot_gtable(ggplot_build(p))  # Building a gtable from the ggplot object
    # Adding the textGrob for the panel letter
    panel_letter = textGrob("A", x = 0.5, y = .9, 
                            just = c("left", "top"), 
                            gp = gpar(fontsize = 40, col =  "black", face="bold"))
    gt <- gtable_add_grob(gt, panel_letter, t=1, l=1, r=1)  # Append the Grob to the table
    
    p <- grid.draw(gt)  # Display the plot
    ggsave("plot.png",gt, width=10, height=10)  # If you want to save it.
    

    0 讨论(0)
  • 2021-01-01 01:18

    Since ggplot2 3.0.0, there is a native way to do this, using the tag label:

    ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species, shape = Species)) +
      geom_point() +
      labs(title = "The Actual Long, Normal Title of Titliness",
           tag = "A")
    

    0 讨论(0)
提交回复
热议问题