2012-01-29 35 views
12

Xem biểu đồ ggplot2 sau đây với văn bản mặt/dải dài được chia thành hai dòng. Văn bản nằm ngoài khu vực dành cho danh hiệu khía cạnh.ggplot2: Tách mặt/dải văn bản thành hai dòng

library(ggplot2) 
x <- c(1:3, 1:3) 
y <- c(3:1, 1:3) 
grp <- c(0, 0, 0, 1, 1, 1) 
p <- qplot(x=x, y=y) + geom_line() + facet_wrap(~ grp) 
grob <- ggplotGrob(p) 
strip.elem.y <- grid.ls(getGrob(grob, "strip.text.x", 
       grep=TRUE, global=TRUE))$name 
grob <- geditGrob(grob, strip.elem.y[1], 
     label="First line and\n second line") 
grid.draw(grob) 

Có cách nào để tăng chiều cao của vùng văn bản dải không?

+1

Bạn có thể sử dụng hàm 'str_wrap' từ' stringr' bên trong 'biến đổi'. Xem [Câu trả lời của Ista] (https://groups.google.com/forum/#!topic/ggplot2/0iODapyt2Pc) để biết chi tiết. –

Trả lời

6

Tôi cố gắng này nhiều cách khác nhau nhưng đã thất vọng nhận được paste(strwrap(text, width=40), collapse=" \n") để cung cấp cho tôi kết quả cho hàng duy nhất của dữ liệu và không nối mỗi chút văn bản từ toàn bộ danh sách.

Tôi đã đưa ra giải pháp phù hợp nhất với mình. Tôi đã viết một chức năng như dưới đây. Cho một dataframe data với cột text

wrapit <- function(text) { 
    wtext <- paste(strwrap(text,width=40),collapse=" \n ") 
    return(wtext) 
} 

data$wrapped_text <- llply(data$text, wrapit) 
data$wrapped_text <- unlist(data$wrapped_text) 

Sau khi tôi gọi chức năng này, tôi chỉ áp dụng chức năng labeller tôi đến cột wrapped_text thay vì text cột.

12

Bạn có thể sử dụng một nhãn 2 dòng:

grp <- c(rep("foo\nbar",3), 1, 1, 1) 
qplot(x=x, y=y) + geom_line() + facet_wrap(~ grp) 
2

ggplot2 hỗ trợ cách tích hợp để thực hiện việc này bằng cách sử dụng label_wrap_gen.

x <- c(1:3, 1:3) 
y <- c(3:1, 1:3) 
grp = c(rep("group 1 with a long name",3),rep("group 2 with a long name",3)) 
d = data.frame(x = x, y =y, grp = grp) 
ggplot(d, aes(x=x,y=y)) + geom_line() + facet_wrap(~ grp, labeller = label_wrap_gen(width=10)) 
Các vấn đề liên quan