2012-02-16 39 views
7

Tôi đang tạo một minh họa bố cục đa lô bằng cách sử dụng R và sẽ thuận tiện để có thể tạo một hộp văn bản nhiều dòng ở một trong các ô.Vẽ một hộp văn bản nhiều dòng trong R

Tôi quen với việc sử dụng Sweave để kết hợp hình ảnh, văn bản và mã R, tuy nhiên vì nhiều lý do tôi cần đây là một cốt truyện trang được tạo ra trong R. Do đó cần phải vẽ một hộp văn bản thay vì sử dụng dấu latex -lên.

Có chức năng nào trong gói hiện có có thể thực hiện việc này không? Không có điều đó, bất cứ ai có thể đề xuất một cách tiếp cận đơn giản để xử lý này?

Hãy xem xét tình huống này:

## Specify the dimensions of the plot 
## that we require 
win.graph(8,4) 

## Two panel layout 
layout(matrix(1:2, 1, 2)) 
par(mar=c(0,0,0,0)) 

## Left panel shows picture 
plot(rep(1:10, each=10), rep(1:10, times=10), 
col=rainbow(100), pch=20, cex=5) 


## Right panel discusses the data 
plot.default(c(0,100), c(0,100), type="n", axes=FALSE, 
ylab="", xlab="") 

text(20, 30, "It would be great if this text box\n 
could handle word wrap, and ideally given the size\n 
of the font (i.e. the cex parameter) and the area\n 
of the plot it should be able to do this dynamically,\n 
without requiring the newline characters I am\n 
manually inserting. Ability to control the line\n 
height would also be nice.\n 
Am I dreaming?", cex=0.75, adj=c(0,0)) 

Output from example

+4

Tôi biết bạn có thể thực hiện gói thông qua 'dán (strwrap (longString, width = WIDTH), collapse = '\ n')', nhưng tôi không biết cách làm việc chiều rộng (trong ký tự) của ô thứ hai theo mặc định để tính chiều rộng để quấn. –

+0

@ mathematics.coffee đây có thể là giải pháp đơn giản nhất. Thương mại tính toán động của điểm bọc từ để đơn giản (tức là chỉ cần chọn một 'WIDTH' theo cách thủ công dựa trên phán đoán trực quan). – digitalmaps

Trả lời

6

Hãy thử splitTextGrob() từ cuốn sách đồ họa R

text = paste(capture.output(licence()),collapse=" ") 
library(RGraphics) 
library(gridExtra) 

grid.arrange(rectGrob(), splitTextGrob(text), ncol=2) 

d <- expand.grid(seq(0.1, 0.9, length=10), seq(0.1, 0.9, length=10)) 
grid.arrange(pointsGrob(d[, 2], d[, 1], pch=21, 
gp=gpar(fill=rainbow(100))), splitTextGrob(text), ncol=2) 

enter image description here

(thử thay đổi kích thước cửa sổ)

Cách tiếp cận này được dựa trên đồ họa lưới, bạn có thể

  • sử dụng mạng/ggplot2/lưới cho lô

  • sử dụng gói gridBase để đặt đồ họa cơ sở trong viewports lưới

+0

Cảm ơn điều này rất hữu ích. Tôi đã kiểm tra 'gridBase' để sử dụng đồ họa' base' và rõ ràng nó là cần thiết để sử dụng 'grid.arrange' trước và sau đó thêm đồ họa cơ sở. (Tôi cần phải kết hợp 'base' vì tôi vẽ đồ vật từ gói' sp' và 'raster'). Họa tiết được kết hợp với gói cho biết rằng điều này là có thể. Tôi sẽ đọc kỹ hơn. – digitalmaps

+0

'grid.arrange()' chỉ là một phím tắt mà tôi đã sử dụng để minh hoạ; có thể bạn sẽ muốn sử dụng 'viewport()' thay cho một ứng dụng thực với 'gridBase'. – baptiste

+0

Chọn đây làm câu trả lời được chấp nhận vì nó giải quyết được vấn đề một cách hoàn toàn và hiệu quả. Nhược điểm duy nhất là đối với những người không quen thuộc với hệ thống đồ họa 'grid', có một chút đường cong học tập. – digitalmaps

2

Một số tùy chọn khác để xem (bạn có thể muốn điều chỉnh mã ở một trong các chức năng này) bao gồm hàm textplot trong gplots gói và addtable2plot trong gói plotrix.

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