Làm cách nào để thêm phụ đề ggplot2 với kích thước và màu sắc khác nhau?


88

Tôi đang sử dụng ggplot2 để cải thiện vạch kết tủa.

Đây là một ví dụ có thể lặp lại về những gì tôi muốn đạt được:

library(ggplot2)
library(gridExtra)
secu <- seq(1, 16, by=2)
melt.d <- data.frame(y=secu, x=LETTERS[1:8])
m <- ggplot(melt.d, aes(x=x, y=y)) +
  geom_bar(fill="darkblue") + 
  labs(x="Weather    stations", y="Accumulated Rainfall [mm]") +
  opts(axis.text.x=theme_text(angle=-45, hjust=0, vjust=1),
       title=expression("Rainfall"), plot.margin = unit(c(1.5, 1, 1, 1), "cm"),
       plot.title = theme_text(size = 25, face = "bold", colour = "black", vjust = 5))
z <- arrangeGrob(m, sub = textGrob("Location", x = 0, hjust = -3.5, vjust = -33, gp = gpar(fontsize = 18, col = "gray40"))) #Or guessing x and y with just option
z

Tôi không biết làm thế nào để tránh sử dụng các số đoán trên hjust và vjust trên ggplot2? Có cách nào tốt hơn để đặt phụ đề (không chỉ sử dụng \ n, mà là một phụ đề có màu văn bản và kích thước khác)?

Tôi cần có thể sử dụng với ggsave để có tệp pdf.

Đây là hai câu hỏi liên quan:

Thêm trích dẫn chú thích bên ngoài diện tích ô trong R?

Làm cách nào để thêm phụ đề và thay đổi kích thước phông chữ của các ô ggplot trong R?

Cảm ơn vì bất kì sự giúp đỡ.


Vjust = -33 phù hợp với tôi trên Linux. Tôi biết rằng phụ có nghĩa là để đi bên dưới cốt truyện, nhưng đó là cách duy nhất để tôi đạt được những gì tôi muốn.
Migue

vì một số lý do điều này làm cho âm mưu của tôi thực sự nhỏ và tạo ra một khoảng trống lớn bên dưới biểu đồ
zazu

2
Câu trả lời của @hrbrmstr dường như là cách để đi hiện nay
vàschar

Câu trả lời:


102

Các bản dựng ggplot2 mới nhất (tức là 2.1.0.9000 hoặc mới hơn) có phụ đề và chú thích bên dưới cốt truyện dưới dạng chức năng tích hợp. Điều đó có nghĩa là bạn có thể làm điều này:

library(ggplot2) # 2.1.0.9000+ 

secu <- seq(1, 16, by=2)
melt.d <- data.frame(y=secu, x=LETTERS[1:8])

m <-  ggplot(melt.d, aes(x=x, y=y))
m <- m + geom_bar(fill="darkblue", stat="identity")
m <- m + labs(x="Weather    stations", 
              y="Accumulated Rainfall [mm]",
              title="Rainfall",
              subtitle="Location")
m <- m + theme(axis.text.x=element_text(angle=-45, hjust=0, vjust=1)) 
m <- m + theme(plot.title=element_text(size=25, hjust=0.5, face="bold", colour="maroon", vjust=-1))
m <- m + theme(plot.subtitle=element_text(size=18, hjust=0.5, face="italic", color="black"))
m

Lỗi trong (function (el, elname):. "Plot.subtitle" không phải là một tên phần tử chủ đề hợp lệ
Luís de Sousa

1
Vui lòng đọc câu trả lời: "ggplot2 mới nhất được xây dựng (ví dụ, 2.1.0.9000 hoặc mới hơn)"
hrbrmstr

75

Bỏ qua câu trả lời này, ggplot2 phiên bản 2.2.0 có chức năng tiêu đề và phụ đề. Xem câu trả lời của @ hrbrmstr bên dưới .


Bạn có thể sử dụng các atophàm lồng nhau bên trong một expressionđể có các kích thước khác nhau.

CHỈNH SỬA Mã đã cập nhật cho ggplot2 0.9.3

m <-  ggplot(melt.d, aes(x=x, y=y)) + 
     geom_bar(fill="darkblue", stat = "identity") + 
     labs(x="Weather    stations", y="Accumulated Rainfall [mm]") + 
     ggtitle(expression(atop("Rainfall", atop(italic("Location"), "")))) +
     theme(axis.text.x = element_text(angle=-45, hjust=0, vjust=1), 
     #plot.margin = unit(c(1.5, 1, 1, 1), "cm"), 
     plot.title = element_text(size = 25, face = "bold", colour = "black", vjust = -1))

nhập mô tả hình ảnh ở đây


10
Xin chào, đây là một giải pháp tuyệt vời. Tôi muốn sử dụng nó, nhưng thay vì atop(italic("Location")tôi muốn có một đối tượng: atop(italic(my_string_vector). Tôi đã thử điều đó nhưng sau đó phụ đề được đánh giá là (my_string_vector) . Làm thế nào để buộc biểu thức này sử dụng giá trị chuỗi và không xử lý văn bản được cung cấp theo nghĩa đen?
Konrad

1
trong trường hợp bạn đang gặp rắc rối sử dụng các biến bạn nên sử dụng bquotethay vì expression, xem đây
toto_tico

3
@Konrad Để sử dụng các đối tượng, hãy thay thế expressionbằng bquotevà bọc các đối tượng bằng .(), như thế này, đối với tiêu đề chính được lưu trữ trong đối tượng có tên "main.title" và đối với phụ đề được lưu trữ trong đối tượng có tên "sub.title": ggtitle(bquote(atop(.(main.title), atop(italic(.(sub.title)), "")))) Tín dụng thuộc về Didzis Câu trả lời của Elferts ở đây: stackoverflow.com/questions/19957536/…
coip 14/09/16

10

Nó dường như optskhông được dùng nữa kể từ ggplot 2 0.9.1 và không còn hoạt động. Điều này làm việc cho tôi với các phiên bản mới nhất của ngày hôm nay: + ggtitle(expression(atop("Top line", atop(italic("2nd line"), "")))).


Điều này cũng hoạt động mà không có phần cuối cùng , ""- phần đó để làm gì?
naught101

Đánh bại tôi. Tôi có thể đã sao chép một ví dụ mà tôi đã thấy ở một nơi khác.
Aren Cambre

Có thể là từ câu trả lời của @ SandyMuspratt ở trên: P - Tôi hiểu nó bây giờ, atop()nó giống như một phân số không có thanh. Vì vậy, đặt cái thứ hai atop()vào bên trong cái thứ nhất sẽ cho bạn một phân số con, với văn bản nhỏ hơn theo tỷ lệ. Phần ""dưới cùng của phân số. Nó dường như là không cần thiết mặc dù - có lẽ atop()có một chuỗi trống mặc định cho tham số thứ hai hoặc một cái gì đó.
naught101

Có vẻ như câu trả lời của @ SandyMuspratt đã được sửa đổi sau khi tôi đăng câu trả lời của mình để phản ánh mã tương tự như của tôi. :-)
Aren Cambre

9

không quá khó để thêm tạp chí vào gtable và tạo một tiêu đề lạ mắt theo cách đó,

library(ggplot2)
library(grid)
library(gridExtra)
library(magrittr)
library(gtable)

p <- ggplot() + 
  theme(plot.margin = unit(c(0.5, 1, 1, 1), "cm"))

lg <- list(textGrob("Rainfall", x=0, hjust=0, 
                    gp = gpar(fontsize=24, fontfamily="Skia", face=2, col="turquoise4")),
               textGrob("location", x=0, hjust=0, 
                        gp = gpar(fontsize=14, fontfamily="Zapfino", fontface=3, col="violetred1")),
           pointsGrob(pch=21, gp=gpar(col=NA, cex=0.5,fill="steelblue")))

margin <- unit(0.2, "line")
tg <- arrangeGrob(grobs=lg, layout_matrix=matrix(c(1,2,3,3), ncol=2),
                  widths = unit.c(grobWidth(lg[[1]]), unit(1,"null")),
                  heights = do.call(unit.c, lapply(lg[c(1,2)], grobHeight)) + margin)

grid.newpage()
ggplotGrob(p) %>%
  gtable_add_rows(sum(tg$heights), 0) %>%
  gtable_add_grob(grobs=tg, t = 1, l = 4)  %>%
  grid.draw()

nhập mô tả hình ảnh ở đây


8

Phiên bản này sử dụng một gtablechức năng. Nó cho phép hai dòng văn bản trong tiêu đề. Văn bản, kích thước, màu sắc và phông chữ của mỗi dòng có thể được đặt độc lập với dòng khác. Tuy nhiên, chức năng sẽ sửa đổi một âm mưu chỉ với một bảng ô duy nhất.

Chỉnh sửa nhỏ: Đang cập nhật lên ggplot2 v2.0.0

# The original plot
library(ggplot2)

secu <- seq(1, 16, by = 2)
melt.d <- data.frame(y = secu, x = LETTERS[1:8])

m <- ggplot(melt.d, aes(x = x, y = y)) + 
     geom_bar(fill="darkblue", stat = "identity") + 
     labs(x = "Weather    stations", y = "Accumulated Rainfall [mm]") + 
     theme(axis.text.x = element_text(angle = -45, hjust = 0, vjust = 1))


# The function to set text, size, colour, and face
plot.title = function(plot = NULL, text.1 = NULL, text.2 = NULL, 
   size.1 = 12,  size.2 = 12,
   col.1 = "black", col.2 = "black", 
   face.1 = "plain",  face.2 = "plain") {

library(gtable)
library(grid)

gt = ggplotGrob(plot)

text.grob1 = textGrob(text.1, y = unit(.45, "npc"), 
   gp = gpar(fontsize = size.1, col = col.1, fontface = face.1))
text.grob2 = textGrob(text.2,  y = unit(.65, "npc"), 
   gp = gpar(fontsize = size.2, col = col.2, fontface = face.2))

text = matrix(list(text.grob1, text.grob2), nrow = 2)
text = gtable_matrix(name = "title", grobs = text, 
   widths = unit(1, "null"), 
   heights = unit.c(unit(1.1, "grobheight", text.grob1) + unit(0.5, "lines"), unit(1.1,  "grobheight", text.grob2) + unit(0.5, "lines")))

gt = gtable_add_grob(gt, text, t = 2, l = 4)
gt$heights[2] = sum(text$heights)

class(gt) =  c("Title", class(gt))

gt
}

# A print method for the plot
print.Title <- function(x) {
   grid.newpage()   
   grid.draw(x)
}


# Try it out - modify the original plot
p = plot.title(m, "Rainfall", "Location", 
   size.1 = 20, size.2 = 15, 
   col.1 = "red", col.2 = "blue", 
   face.2 = "italic")

p

nhập mô tả hình ảnh ở đây


3

Bạn có thể sử dụng gói âm mưu trong grid.arrange và chuyển một tiêu đề dựa trên lưới tùy chỉnh,

nhập mô tả hình ảnh ở đây

library(ggplot2)
library(gridExtra)

p <- ggplot() + 
  theme(plot.margin = unit(c(0.5, 1, 1, 1), "cm"))

tg <- grobTree(textGrob("Rainfall", y=1, vjust=1, gp = gpar(fontsize=25, face=2, col="black")),
               textGrob("location", y=0, vjust=0, gp = gpar(fontsize=12, face=3, col="grey50")),
               cl="titlegrob")
heightDetails.titlegrob <- function(x) do.call(sum,lapply(x$children, grobHeight))

grid.arrange(p, top = tg)

Phiên bản hiện tại của ggplot sử dụng theme và element_text thay vì opt và theme_text tương ứng. Ngoài ra, cách tiếp cận ggplotGrob dường như thất bại trong phiên bản hiện tại của gridExtra (gridExtra_0.8.1) và ggplot2 (ggplot2_0.9.3.1)
russellpierce

2

Bạn có thể nhận thấy rằng mã của Sandy không tạo ra tiêu đề in đậm cho "Rainfall" - hướng dẫn thực hiện in đậm này sẽ xảy ra trong hàm atop () hơn là hàm theme ().

ggplot(melt.d, aes(x=x, y=y)) + 
 geom_bar(fill="darkblue", stat = "identity") + 
 labs(x="Weather    stations", y="Accumulated Rainfall [mm]") + 
 ggtitle(expression(atop(bold("Rainfall"), atop(italic("Location"), "")))) +
 theme(axis.text.x = element_text(angle=-45, hjust=0, vjust=1),
 plot.title = element_text(size = 25, colour = "black", vjust = -1))

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.