今天我们来说一说可视化的问题,如果这个时候我们要对频数进行可视化的话,我们首先想到的应该是一个什么样子的图形呢?很多人可能会说是柱状图。还有一些科研喵们,看过我们的教程的,可能会想到棒棒糖图(Lollipop)或者说滑珠图(Dot plot)。当然这些图都是适合的,但是这些图形都存在一个严重的问题,那就是他们只适合于分类较少时的绘图。
当分类的种类比较少时,我们可以选择上面刚刚讲过的柱状图或者是滑珠图。但是当分类的种类非常多,比如说成百上千时,我们就没有很好的方法来对它进行展示了。这个时候就可以引入一种新的图形:词云图(word cloud)。
所谓词云图(word cloud),顾名思义,就是把词汇拼接成在一起像云朵一样。如下图所示:
在这个图形中,由很多个词汇或者分类名称构成,它们大小不同,因为这些词语的大小都对应了它们各自的频数,频数越高的,size越大。这样的图形,我们在网页中经常遇到,不过在科研绘图中应用较少,我猜想了几个原因:一个可能是因为很多人不知道可以用这样的图形,一个可能是因为词云图的绘制比较难,很多绘图软件不提供词云图。其实,在很多场合都是可以用到词云图的,甚至用词云图更为合适。举个例子来说,我们在罗列检测到的热点突变时,经常用table表格来表示,因为突变往往有很多,用常规图形是无法绘制完整的。这个时候,不妨尝试使用词云图。下面我们就来讲解词云图的绘制,先来看看数据。
测试数据
这个数据长什么样子呢?首先数据分为两列,非常简单,第1列就是我们的文字或者是词语,或者是某些分类的名称。第2列就是我们统计的频数,也就是count。借用今时今日,在大洋彼岸正在发生的大事为例,我们准备了如下的数据(仔细看)。
好了,下面开始绘图。拿到这个数据以后呢,就可以直接用R包wordcloud2进行绘图了。
初级绘图
首先是非常简单的初级绘图。直接用wordcloud2()这个函数,输入我们的词语和频数的数据框就可以绘图了。
代码语言:javascript复制# Read in data
data = read.table("words.txt",header = T,sep="t")
head(data)
# Gives a proposed palette
wordcloud2(data, size=0.5, color='random-light')
高级调整
如果你觉得这个颜色不够漂亮,在这里我们可以自定义color,比如我们选择默认的random-dark颜色值,就可以得到比较深的颜色。
代码语言:javascript复制# or a vector of colors. vector must be same length than input data
wordcloud2(data, size=0.5, color='random-dark' )
在这里,我们自己从配色面板中挑选了一个合适的颜色,绘制出来是这样的,有没有很惊艳呢?
代码语言:javascript复制# Use colors from wesanderson package
pacman::p_load("wesanderson")
names(wes_palettes)
wordcloud2(data, size=0.5, color=rep(wes_palette("Darjeeling1", 5), nrow(data)) )
当然,我们也可以使用backgroundColor来调整背景色,比如黑色,有种街头炫酷风:
代码语言:javascript复制# Change the background color
wordcloud2(demoFreqC, size=1.5, color='random-light', backgroundColor="black")
终极优化
刚才我们绘制的图形都是圆形的,这也是绘图函数默认的外形。当然,我们可以调整这个图形的外观,用shape参数,根据使用说明shape可以等于'circle' (圆形,默认), 'cardioid' (心形), 'diamond' (菱形), 'triangle-forward', 'triangle'(三角形), 'pentagon'(五角星)和'star'(星形)。现在我们尝试使用星形,绘制出来的图形如下:
代码语言:javascript复制# Change the shape
wordcloud2(data, size=0.6, color='random-dark', shape = "star")
另外,我们这里看到的文字的方向都是随机倾斜的,为了让字体的排列更加整齐,我们可以自定义文字的旋转方向,比如都是水平的,或者都是垂直的,通过minRotation和maxRotation函数就可以实现。
代码语言:javascript复制# Rotation
wordcloud2(data, size = 0.5, shape="triangle",
minRotation = pi/0.5, maxRotation = pi/0.5, rotateRatio = 1,
color = rep(wes_palette("BottleRocket2", 5), nrow(data)))
好了,关于本期的词云图,我们就讲到这里,想要获得测试数据和绘图代码的同学,可以在文末联系客服领取。