使用R绘制其他图形之热图及网络图

浏览: 1872

热力图是一种非常常用的统计图形,该图将两个变量(一般是离散变量)的交叉汇总信息以颜色的形式展现出来,而映射给颜色变量的是连续型数值变量,下面就以例子说明热力图的优势:

#模拟数据集

set.seed(123)

Year <- rep(2006:2015, each = 4)

Quater <- rep(c('Q1','Q2','Q3','Q4'), times = 10)

Counts <- round(runif(40, min = 10, max = 200))

df <- data.frame(Year = Year, Quater = Quater, Counts = Counts)

热力图可以通过stats包的heatmap()函数绘制,也可以通过ggplot2包中的geom_tile()函数或geom_raster()函数绘制,这里就以ggplot2包中的函数为例:

library(ggplot2)

#使用geom_tile()函数

ggplot(data = df, mapping = aes(x = Year, y = Quater, fill = Counts)) + geom_tile()

#或者使用geom_raster()函数

ggplot(data = df, mapping = aes(x = Year, y = Quater, fill = Counts)) + geom_raster()


两者绘制的结果区别不大,一般geom_raster()效率更高,且更适合打印。

哎?这里发现三个问题:

1)横坐标年怎么出现小数了?

2)一般认为颜色越深代表的值越大,这里恰好相反

3)季度坐标从上到下正好是反的季度顺序,能否颠倒一下?

解决办法:

1)将横坐标年份离散化,改为因子

2)只需将默认颜色颠倒一下即可:scale_fill_continuous(low = '#56B1F7', high = '#132B43')

3)对于离散变量可以使用scale_y_discrete(limits=c('Q4','Q3','Q2','Q1'))方法实现颠倒,对于连续变量可以直接使用scale_y_reverse()实现刻度的颠倒

具体操作如下:

ggplot(data = df, mapping = aes(x = factor(Year), y = Quater, fill = Counts)) + geom_tile() + scale_fill_continuous(low = '#56B1F7', high = '#132B43') + scale_y_discrete(limits=c('Q4','Q3','Q2','Q1')) + xlab('Year')


这样就能非常快速的查看到哪年那季度的数量较多和较少,总比单纯的数字形式要强:

head(df, 10)


很显然,这是一个长形表,如何将其转换为宽形表呢?这里使用tidyr包中的spread()函数加以实现

#长形表变宽形表

library(tidyr)

spread(data = df, key = Quater, value = Counts)


这就是将一个长形表变为宽形表后呈现的数值交叉表,如果这样一个数据给老板看,老板肯定会不耐烦。

还有一种常用的图是网络图网络图一般用于描述关系强弱或路径分析等,通过网络图可以非常直观的发现数据之间的关联。R中igraph包中的graph()或data.frame.graph()函数实现网络图的绘制。这里仍然以案例的形式展示网络图的绘制:

#使用gcookbook包中的madmen数据集

library(gcookbook)

head(madmen)


#加载igraph包

library(igraph)

opar <- par(no.readonly = TRUE)

par(mar = c(0,0,0,0))

#选择layout.fruchterman.reingold布局,绘制有方向的网络图

g <- graph.data.frame(madmen, directed = TRUE)

plot(g, layout = layout.fruchterman.reingold, vertex.size = 8, edge.arrow.size = 0.5, vertex.label = NA)

par(opar)




很简单,一幅网络图就绘制好了,通过箭头就可以知道节点与节点之间的方向,也可以看出哪些人物是核心人物。下面用圆形布局绘制网络图:

opar <- par(no.readonly = TRUE)

par(mar = c(0,0,0,0))

#选择layout.circle布局,绘制无方向的网络图

g <- graph.data.frame(madmen, directed = FALSE)

plot(g, layout = layout.circle, vertex.size = 8, vertex.label = NA)

par(opar)



上面的两幅网络图能够很清晰的看出哪些节点之间是紧密联系的,哪些节点是核心节点,但这里并没有具体显示这些节点都代表什么含义,下面看看如何为节点添加标签

#查看标签内容

V(g)$name


#绘制带标签的节点

opar <- par(no.readonly = TRUE)

par(mar = c(0,0,0,0))

g <- graph.data.frame(madmen, directed = FALSE)

plot(g, layout = layout.fruchterman.reingold, vertex.size = 8, vertex.label = V(g)$name, vertex.label.cex = 0.6, vertex.label.dist = 0.5)

par(opar)




这样是不是就非常清爽啦,就能够具体识别到哪些重要的节点了。

除此,我们还可以在节点与节点之间的连线上做文章,如设置连线的颜色、为某些特殊的连线加上标签、设置标签大小等。

#绘制带标签的节点

opar <- par(no.readonly = TRUE)

par(mar = c(0,0,0,0))

g <- graph.data.frame(madmen, directed = FALSE)

这里使用另外一种形式来修改连线之间的属性,即E(g)格式:

#将所有连线设置为黑色

E(g)$color = 'black'

#将指定连线设置为红色

E(g)[c(2,8,10)]$color = 'red'

#将指定连线的变迁设置为L1,L2,L3

E(g)[c(2,8,10)]$label = c('L1','L2','L3')

#设置标签属性和连续属性

plot(g, layout = layout.fruchterman.reingold, vertex.size = 8, vertex.label = V(g)$name, vertex.label.cex = 0.6, vertex.label.color = 'black', vertex.label.dist = 0.5, edge.label.cex = 0.8, edge.label.color = 'blue')

par(opar)



更多关于网络图的绘制可查看igragh包帮助文档,帮助文档中有非常丰富的函数,可以绘制各种布局的网络图等。

参数资料:

R数据可视化手册

推荐 3
本文由 每天进步一点点2015 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册