2013-03-23 7 views
2

Я создал простой Wordcloud:Как сложить слова в гроте?

require(wordcloud)  
words <- c('affectionate', 'ambitious', 'anxious', 'articulate', 'artistic', 'caring', 'contented', 'creative', 'cynical', 'daring', 'dependable', 'easygoing', 'energetic', 'funny', 'generous', 'genuine', 'goodlistener', 'goodtalker', 'happy', 'hardworking', 'humerous', 'impulsive', 'intelligent', 'kind', 'loyal', 'modest', 'optimistic', 'outgoing', 'outrageous', 'passionate', 'perceptive', 'physicallyfit', 'quiet', 'rational', 'respectful', 'romantic', 'shy', 'spiritual', 'spontaneous', 'sweet', 'thoughtful', 'warm') 
freqs <- c(134, 53, 0, 5, 0, 247, 0, 78, 0, 0, 134, 178, 79, 344, 63, 65, 257, 0, 109, 113, 0, 0, 107, 51, 199, 24, 67, 232, 0, 109, 24, 28, 29, 2, 105, 70, 0, 35, 64, 156, 66, 45) 
wordcloud(words, freqs) 

Я хотел бы, чтобы поместить это в «Grob», так что я могу это устроить с несколькими другими участками, используя grid.arrange() в gridExtra упаковке:

require(ggplot2) 
p1 <- qplot(1:10, rnorm(10), colour = runif(10)) 
require(gridExtra) 
grid.arrange(p1, my.wordcloud) 

Я понимаю, что мое словосочетание должно быть «гробом» для этого, но я не понимаю, как это сделать. Я попытался использовать функцию grob() в пакете gridExtra, но это не сработало. Предложения?

+2

Возможно, это полезно: http://stackoverflow.com/questions/14124373/combine-base-and-ggplot-graphics-in-r-figure-window/14125768#14125768 –

+1

метод построения слова для использования wordcloud использует базу графика, а не сетчатая графика (поэтому никакой grob не может инкапсулировать чертеж, или он должен быть написан с нуля). Лучше всего следовать примерам пакета gridBase. – baptiste

+1

Связанный: http: // stackoverflow.com/questions/11253765/geom-wordcloud-is-this-a-pipe-dream – Spacedman

ответ

8

Это не должно быть трудно адаптировать код в wordcloud, чтобы построить данные, необходимые для заполнения текстовой строки в сетке. Код wordcloud отправляет значения x, y, text и rot на базу text функция после того, как указано окно с пределами 0,0 и 1, 1.

мне нужно, чтобы добавить это до того, как для петли:

textmat <- data.frame(x1=rep(NA, length(words)), y1=NA, words=NA_character_, 
         rotWord=NA, cexw=NA, stringsAsFactors=FALSE) 

Это в конце для цикла:

textmat[i, c(1,2,4,5) ] <- c(x1=x1, y1=y1, rotWord=rotWord*90, cexw = size[i]) 
textmat[i, 3] <- words[i] 

и необходимо изменить вызов .overlap, потому что по-видимому, не экспортируется:

if (!use.r.layout) 
     return(wordcloud:::.overlap(x1, y1, sw1, sh1, boxes)) 

И я возвратил его невидимо после завершения цикла:

return(invisible(textmat[-1, ])) # to get rid of the NA row at the beginning 

После назвав его wordcloud2:

> tmat <- wordcloud2(c(letters, LETTERS, 0:9), seq(1, 1000, len = 62)) 
> str(tmat) 
'data.frame': 61 obs. of 5 variables: 
$ x1  : num 0.493 0.531 0.538 0.487 ... 
$ y1  : num 0.497 0.479 0.532 0.475 ... 
$ words : chr "b" "O" "M" ... 
$ rotWord: num 0 0 0 0 0 0 0 0 0 ... 
$ cexw : num 0.561 2.796 2.682 1.421 ... 

draw.text <- function(x,y,words,rotW,cexw) { 
    grid.text(words, x=x,y=y, rot=rotW, gp=gpar(fontsize=9*cexw)) } 

for(i in 1:nrow(tmat)) { draw.text(x=tmat[i,"x1"], y=tmat[i,"y1"], 
            words=tmat[i,"words"], rot=tmat[i,"rotWord"], 
            cexw=tmat[i,"cexw"]) } 

Как было предложено:

with(tmat, grid.text(x=x1, y=y1, label=words, rot=rotWord, 
         gp=gpar(fontsize=9*cexw)) } # untested 
+0

Откуда взялось магическое число «9» в fontsize = 9 * cexw? – Spacedman

+0

Я просто конвертирую от размеров cex к шрифтам. При желании выберите другой размер по умолчанию. –

+0

аргументы textGrob векторизованы, поэтому вы можете обойтись без последнего цикла for и вернуть один textGrob. – baptiste

3

вы можете использовать gridBase пакет, но с умным просмотра. здесь я использую vpStack, чтобы получить хорошие размеры.

par(mfrow=c(1, 2)) 
wordcloud(words, freqs) 
plot.new()    
vps <- baseViewports() 
p <- qplot(1:10, rnorm(10), colour = runif(10)) 
print(p,vp = vpStack(vps$figure,vps$plot)) 

enter image description here

EDIT Используйте knitr, если вы хотите просто сгенерировать PDF.

Другой вариант, если вы хотите просто создать pdf-файл, вы можете использовать Knitr. Смешивание сетки и базовой графики очень просто. Латекс выполнит эту работу за вас. Например, приведенный выше результат может быть получен этим куском.

<<mixgridwithggplot, fig.show='hold',out.width='.5\\linewidth'>>= 
wordcloud(words, freqs) 
qplot(1:10, rnorm(10), colour = runif(10)) 
@ 

Я уверен, что knitr может создать PNG из 2-х участков в одном формате PNG позади кода.