对ggplot geom_text使用wordlayout结果

时间:2014-01-15 11:12:35

标签: r ggplot2 size word-cloud

R包wordcloud有一个非常有用的功能,叫做wordlayout。它采用单词的初始位置及其各自的大小,以不重叠的方式重新排列它们。我想用这个函数的结果在ggplot中做一个geom_text图。 我提出了以下示例,但很快就意识到,在cex(wordlayout)和size(geom_plot)之间似乎存在很大差异,因为图形包中的单词看起来更大。 这是我的示例代码。 Plot 1是原始的wordcloud图,没有重叠:

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")

有没有办法克服这个cex / size差异并重复使用wordlayout进行ggplots?

2 个答案:

答案 0 :(得分:4)

cex代表字符扩展,是cin指定的相对于默认值放大文字的因素 - 在我的安装中设置为0.15 in 0.2 in:参见?par了解更多详情。

@hadley explains ggplot2 size以mm为单位。因此,cex=1将对应size=3.81size=5.08,具体取决于是否按宽度或高度进行缩放。当然,字体选择可能会导致差异。

此外,要使用绝对大小,您需要在aes之外设置大小规格,否则它会将其视为一个变量来映射并选择比例本身,例如:

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

答案 1 :(得分:4)

可悲的是,我认为你会找到简短的答案是否定的!我认为包处理文本向量映射与ggplot2不同,所以你可以修改大小和字体/族等,但很难复制包正在做什么。

我尝试了一些事情:

1)尝试使用annotation_custom

从textdata绘制grobs
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)运行wordlayout()函数,该函数应该重新调整文本,但很难看到什么字体(同样不起作用)

# 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

如果你只是想在其上面覆盖其他ggplot函数,那么这是一个骗子(尽管合作数据似乎与数据和情节之间并不完全匹配)。它基本上是对wordcloud进行成像,去掉边距,并以相同的比例绘制它:

# 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