2014-01-15 16 views
6

Das R-Paket wordcloud hat eine sehr nützliche Funktion, die Wordlayout heißt. Es nimmt Anfangspositionen von Wörtern und ihre jeweiligen Größen an und ordnet sie so an, dass sie sich nicht überschneiden. Ich möchte die Ergebnisse dieser Funktionen verwenden, um einen geom_text-Plot in ggplot zu erstellen. Ich kam zu dem folgenden Beispiel, erkannte aber bald, dass es einen großen Unterschied zwischen Cex (Wordlayout) und Größe (Geom_plot) zu geben scheint, da Wörter im Grafikpaket viel größer erscheinen. hier ist mein Beispielcode. Plot 1 ist die ursprüngliche Wordcloud Handlung, die keine Überschneidungen hat:Verwenden Sie wordlayout Ergebnisse für ggplot geom_text

library(wordcloud) 
library(tm) 
library(ggplot2) 

samplesize=100 
textdf <- data.frame(label=sample(stopwords("en"),samplesize,replace=TRUE),x=sample(c(1:1000),samplesize,replace=TRUE),y=sample(c(1:1000),samplesize,replace=TRUE),size=sample(c(1:5),samplesize,replace=TRUE)) 

#plot1 
plot.new() 
pdf(file="plot1.pdf") 
textplot(textdf$x,textdf$y,textdf$label,textdf$size) 
dev.off() 
#plot2 
ggplot(textdf,aes(x,y))+geom_text(aes(label = label, size = size)) 
ggsave("plot2.pdf") 
#plot3 
new_pos <- wordlayout(x=textdf$x,y=textdf$y,words=textdf$label,cex=textdf$size) 
textdf$x <- new_pos[,1] 
textdf$y <- new_pos[,2] 
ggplot(textdf,aes(x,y))+geom_text(aes(label = label, size = size)) 
ggsave("plot3.pdf") 
#plot4 
textdf$x <- new_pos[,1]+0.5*new_pos[,3]#this is the way the wordcloud package rearranges the positions. I took this out of the textplot function 
textdf$y <- new_pos[,2]+0.5*new_pos[,4] 
ggplot(textdf,aes(x,y))+geom_text(aes(label = label, size = size)) 
ggsave("plot4.pdf") 

ist es eine Möglichkeit, diese CEX/Größenunterschied zu überwinden und wieder verwenden wordlayout für ggplots?

Antwort

4

cex steht für Charakter Expansion und ist der Faktor, um den Text relativ zu dem Standard vergrößert wird, durch cin angegeben - eingestellt auf meiner Installation auf 0,15 von 0,2 in: ?par für weitere Details sehen.

@hadley explains dass ggplot2 size s in mm gemessen werden. Daher würde cex=1size=3.81 oder size=5.08 entsprechen, je nachdem, ob es durch die Breite oder Höhe skaliert wird. Natürlich kann die Schriftauswahl Unterschiede verursachen.

Zusätzlich absolute Größen zu verwenden, müssen Sie die Größenangabe außerhalb des aes sonst haben sie hält es für eine Variable abzubilden und wählen Sie die Waage selbst, zB:

ggplot(textdf,aes(x,y))+geom_text(aes(label = label),size = textdf$size*3.81) 
+0

Ihnen danken. Ich habe nur die Änderungen vorgenommen, die Sie vorgeschlagen haben (ich habe dieselben Par() $ cin-Standardwerte wie Sie). Nun scheinen die Wörter gleich groß zu sein, aber die Wörter in meinem ggplot sind total überlagert. Dort sind Wörter weniger Wörter sichtbar Textplot. siehe [plot1] (http://homepage.univie.ac.at/stephan.schloegl/stuff/plot1.pdf) [plot3] (http://homepage.univie.ac.at/stephan.schloegl/stuff/plot3 .pdf) [plot4] (http://homepage.univie.ac.at/stephan.schloegl/stuff/plot4.pdf) – supersambo

+0

Vielleicht basieren die Positionen auch auf anderen Einheiten – James

+0

Eigentlich sieht es so aus, als ob textplot die Position des Mittelpunkts verwendet, während ggplot die Position der linken Kante des Textes verwenden könnte? – James

4

Leider glaube ich dir werde die kurze Antwort finden, nein! Ich denke, das Paket behandelt das Textvektor-Mapping anders als ggplot2, so dass Sie mit Größe und Schriftart Face/Familie usw. basteln können, aber es wird schwer sein, genau zu replizieren, was das Paket tut.

habe ich versucht, ein paar Dinge:

1) Versuchen Sie, die Grobs von Textdaten mit annotation_custom

require(plyr) 
require(grid) 

# FIRST TRY PLOT INDIVIDUAL TEXT GROBS 
qplot(0:1000,0:1000,geom="blank") + 
    alply(textdf,1,function(x){ 
    annotation_custom(textGrob(label=x$label,0,0,c("center","center"),gp=gpar(cex=x$size)),x$x,x$x,x$y,x$y) 
}) 

enter image description here

2) Führen Sie die wordlayout() Funktion zu zeichnen, die den Text neu einstellen sollte , aber schwer zu erkennen, für welche Schriftart (in ähnlicher Weise funktioniert nicht)

# THEN USE wordcloud() TO GET CO-ORDS 
plot.new() 
wordlayout(textdf$x,textdf$y,words=textdf$label,cex=textdf$size,xlim=c(min(textdf$x),max(textdf$x)),ylim=c(min(textdf$y),max(textdf$y))) 
plotdata<-cbind(data.frame(rownames(w)),w) 
colnames(plotdata)=c("word","x","y","w","h") 

# PLOT WORDCLOUD DATA 
qplot(0:1000,0:1000,geom="blank") + 
    alply(plotdata,1,function(x){ 
    annotation_custom(textGrob(label=x$word,0,0,c("center","center"),gp=gpar(cex=x$h*40)),x$x,x$x,x$y,x$y) 
    }) 

enter image description here

Hier ist ein Betrüger, wenn Sie nur andere ggplot Funktionen auf es overplot wollen (obwohl die Co-ords scheinen nicht genau zwischen den Daten übereinstimmen und dem Grundstück). Es besteht im Wesentlichen Bilder der Wordcloud, entfernt die Ränder und Untergrund es im gleichen Maßstab:

# make a png file of just the panel 
plot.new() 
png(filename="bgplot.png") 
par(mar=c(0.01,0.01,0.01,0.01)) 
textplot(textdf$x,textdf$y,textdf$label,textdf$size,xaxt="n",yaxt="n",xlab="",ylab="",asp=1) 
dev.off() 

# library to get PNG file 
require(png) 

# then plot it behind the panel 
qplot(0:1000,0:1000,geom="blank") + 
    annotation_custom(rasterGrob(readPNG("bgplot.png"),0,0,1,1,just=c("left","bottom")),0,1000,0,1000) + 
    coord_fixed(1,c(0,1000),c(0,1000)) 

enter image description here

Verwandte Themen