词云图,看过没做过?快来,教你秘籍

2020-06-16 09:53:45 浏览数 (1)

很多时候我们会遇到这样的一个问题,一堆数据中有很多个物品或者种类,我们需要对其进行频数的统计。比如说在一组肿瘤患者当中,I期和II期肿瘤占了多少?III期肿瘤占了多少IV肿瘤占了多少?如果,我们要对这些病人进行频数统计,这个很简单就可以实现,SPSS可以做,R里面的table函数也可以做,我们不讨论统计的问题。

今天我们来说一说可视化的问题,如果这个时候我们要对频数进行可视化的话,我们首先想到的应该是一个什么样子的图形呢?很多人可能会说是柱状图。还有一些科研喵们,看过我们的教程的,可能会想到棒棒糖图(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)))

好了,关于本期的词云图,我们就讲到这里,想要获得测试数据和绘图代码的同学,可以在文末联系客服领取。

0 人点赞