2

簡単なワードクラウドを作成しました:

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)

grid.arrange()これを「グロブ」に入れて、gridExtraパッケージで使用する他のいくつかのプロットで配置できるようにしたいと思います。

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

これを行うには、ワードクラウドが「グロブ」でなければならないことは理解していますが、そのようにする方法がわかりません。grob()パッケージ内の関数を使用してみましたgridExtraが、うまくいきませんでした。提案?

4

2 に答える 2

8

wordcloudグリッドにtext.grobを入力するために必要なデータを作成するために、コードを適応させることはそれほど難しいことではありません。このコードは、制限が0,0および1、1のウィンドウが指定された後、wordcloudx、y、text、およびrotの値を基本関数に送信します。text

forループの前にこれを追加する必要がありました:

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

これは、forループの最後にあります。

 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
于 2013-03-23T08:54:12.057 に答える
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))

ここに画像の説明を入力

EDITknitr 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を作成できると確信しています。

于 2013-03-23T09:39:37.500 に答える