2012-02-16 10 views
7

Tworzę wielopunktowy rysunek układu za pomocą R, a wygodnie byłoby móc utworzyć wieloliniowe pole tekstowe na jednym z wykresów.Wykreślanie wielolinijkowego pola tekstowego w R

Jestem zaznajomiony z używaniem Sweave do łączenia obrazów, tekstu i kodu R, jednak z różnych powodów potrzebuję tego, aby był to pojedynczy wydruk strony wyprodukowany w R. W związku z tym należy wykreślić pole tekstowe zamiast używać znaku lateksu -w górę.

Czy istnieje funkcja w istniejącym pakiecie, która może to zrobić? Jeśli to nie pomoże, czy ktoś może zaproponować proste podejście do tego problemu?

Rozważmy taką sytuację:

## 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

Wiem, że można wykonać owijanie za pomocą 'paste (strwrap (longString, width = WIDTH), collapse = '\ n')', ale nie jestem pewien, jak obliczyć szerokość (w znakach) Drugi dział domyślnie, aby obliczyć szerokość, na której ma się zawijać. –

+0

@ mathematical.coffee może to być najprostsze rozwiązanie. Obracaj dynamiczne obliczenia punktu zawijania słowa dla uproszczenia (to jest wybierz "WIDTH" ręcznie na podstawie wizualnej oceny). – digitalmaps

Odpowiedz

6

Spróbuj splitTextGrob() z książki graficznej 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

(próby zmiany rozmiaru okna)

To podejście jest oparte na grafice siatki, można

  • wykorzystanie kraty/ggplot2/siatka na działkach

  • użyć pakietu gridBase umieszczenie grafiki bazowe wewnątrz rzutni siatki

+0

Dzięki temu jest to pomocne. Sprawdziłem 'gridBase', aby użyć grafiki' base' i oczywiście konieczne jest najpierw użycie 'grid.arrange', a następnie dodanie grafiki podstawowej. (Muszę włączyć 'base', ponieważ rysuję obiekty z pakietów' sp' i 'raster'). Winieta powiązana z pakietem wskazuje, że jest to możliwe. Przyjrzę się dokładniej. – digitalmaps

+0

'grid.arrange()' był tylko skrótem, którego użyłem dla ilustracji; prawdopodobnie będziesz chciał użyć 'viewport()' dla prawdziwej aplikacji z 'gridBase'. – baptiste

+0

Wybór tej opcji jako zaakceptowanej odpowiedzi, ponieważ całkowicie i skutecznie rozwiązuje problem. Jedynym minusem jest to, że dla osób niezaznajomionych z systemem graficznym 'siatka', istnieje trochę krzywej uczenia się. – digitalmaps

2

Niektóre inne opcje do obejrzenia (możesz chcieć dostosować kod w jednej z tych funkcji) obejmują funkcję textplot w pakiet i addtable2plot w pakiecie plotrix.