2016-12-12 33 views
9

Tôi muốn căn chỉnh plot.title, plot.subtitleplot.caption trong thanh công cụ ggplot2 nằm ngang.Căn chỉnh tiêu đề, tiêu đề phụ và chú thích cho thanh ngang ggplot

Ví dụ:

library("ggplot2") # ggplot2 2.2 
df <- data.frame(type=factor(c("Brooklyn", 
           "Manhatten and\n Queens")), 
       value=c(15,30)) 

# manual hjust for title, subtitle & caption 
myhjust <- -0.2 

ggplot(df, 
     aes(x=type, y=value)) + 
    geom_bar(stat='identity') + 
    coord_flip() + 
    labs(
    title = "This is a nice title", 
    subtitle = "A subtitle", 
    caption = "We even have a caption. A very long one indeed.") + 
    theme(axis.title=element_blank(), 
     plot.title=element_text(hjust = myhjust), 
     plot.subtitle=element_text(hjust = myhjust), 
     plot.caption=element_text(hjust = myhjust)) 

Làm thế nào tôi có thể sắp xếp tất cả 3 yếu tố labs (plot.title, plot.subtitleplot.caption) đến nơi axis.text bắt đầu (đỏ đường thẳng đứng, "M" của Manhattan)?

Ngoài ra: Tại sao kết quả myhjust cố định ở 3 vị trí ngang khác nhau cho plot.title, plot.subtitleplot.caption?

Problem

+2

Đây là một câu hỏi lớn, cũng minh họa, và giải thích rõ ràng. Đó là một vấn đề mà tôi gặp phải thường xuyên với ggplot. Trong khi grid.arrange() thay thế dưới đây là hoàn toàn khả thi, với tôi nó không phải là một câu trả lời đầy đủ cho câu hỏi này. Ví dụ: tại sao giá trị tương tự không ảnh hưởng đến tiêu đề, phụ đề và chú thích giống nhau? Tôi nghĩ câu trả lời là điểm tham chiếu là giữa chuỗi văn bản trong mỗi trường hợp. Trong khi điều này là hợp lý cho văn bản trung tâm hợp lý, nó không hoạt động cho biện minh trái hoặc phải ngoài khu vực cốt truyện. Có vẻ như đây là một thiết lập đơn giản. – jzadra

Trả lời

5

Trong khi bạn có thể chỉnh sửa những ba grobs, bạn cũng có thể chỉ:

library(gridExtra) 
library(grid) 

grid.arrange(
    textGrob("This is a nice title", 
      gp=gpar(fontsize=16, col="#2b2b2b"), 
      x=unit(0.005, "npc"), just=c("left", "bottom")), 
    textGrob("A subtitle", 
      gp=gpar(fontsize=12, col="#2b2b2b"), 
      x=unit(0.005, "npc"), just=c("left", "bottom")), 
    ggplot(df, aes(x=type, y=value)) + 
    geom_bar(stat='identity') + 
    coord_flip() + 
    theme(axis.title=element_blank()), 
    textGrob("We even have a caption. A very long one indeed.", 
      gp=gpar(fontsize=9, col="#2b2b2b"), 
      x=unit(0.005, "npc"), just=c("left", "bottom")), 
    ncol=1, 
    heights=c(0.075, 0.025, 0.85, 0.05) 
) 

Thực hiện một wrapper cho nó, đặt nó trong một pkg cá nhân. Boom. Làm xong.


library(ggplot2) 
library(gridExtra) 
library(grid) 

df <- data.frame(type=factor(c("Brooklyn","Manhatten and\n Queens")), value=c(15,30)) 

ggplot(df, aes(x=type, y=value)) + 
    geom_bar(stat='identity') + 
    coord_flip() + 
    theme(axis.title=element_blank()) + 
    theme(plot.margin=margin(l=0, t=5, b=5))-> gg 

flush_plot <- function(x, title, subtitle, caption) { 
    tg <- function(label, ...) { 
    textGrob(label, x=unit(0, "npc"), just=c("left", "bottom"), 
      gp=do.call(gpar, as.list(substitute(list(...)))[-1L])) } 
    grid.arrange(
    tg(title, fontsize=16, col="#2b2b2b"), 
    tg(subtitle, fontsize=12, col="#2b2b2b"), x, 
    tg(caption, fontsize=9, col="#2b2b2b"), 
    ncol=1, heights=c(0.075, 0.025, 0.85, 0.05) 
) 
} 

flush_plot(gg, "This is a nice title", "A subtitle", 
      "We even have a caption. A very long one indeed.") 
+0

Điều này căn chỉnh tiêu đề, phụ đề và chú thích, nhưng không giống như các nhãn trục y. – Chrisss

+0

'plot.margin = unit (c (0,0,0,0)," line ")' sẽ sửa lỗi – baptiste

+1

@hrbrmstr Câu trả lời tuyệt vời! Nhưng phải trung thực: Tôi sẽ thích một giải pháp ggplot2 thuần túy mặc dù có ít mã hơn ... nếu có một/-: –

Các vấn đề liên quan