2016-04-19

课程介绍

摘要:讲解R语言中基础绘图函数和高级绘图包的使用,理解可视化探索的各种方法

  • 基础绘图包
  • lattice包
  • ggplot2包
  • 其他图形

点击此处,下载本课用到的数据

为什么需要可视化

数据可视化(Data visualization)

之所以说“一图胜千言”,是因为可视化能充分的利用人脑的优势。我们从如下的四组数据观察一下。

data <- read.table('data/anscombe.txt',T)
data <- data[,-1]
head(data)
  x1 x2 x3 x4   y1   y2    y3   y4
1 10 10 10  8 8.04 9.14  7.46 6.58
2  8  8  8  8 6.95 8.14  6.77 5.76
3 13 13 13  8 7.58 8.74 12.74 7.71
4  9  9  9  8 8.81 8.77  7.11 8.84
5 11 11 11  8 8.33 9.26  7.81 8.47
6 14 14 14  8 9.96 8.10  8.84 7.04

数据可视化

计算一些统计指标尝试一下。首先计算各组数据的均值,再计算四组数据的相关系数。

colMeans(data)
    x1     x2     x3     x4     y1     y2     y3     y4 
9.0000 9.0000 9.0000 9.0000 7.5009 7.5009 7.5000 7.5009 
sapply(1:4,function(x) cor(data[,x],data[,x+4]))
[1] 0.81642 0.81624 0.81629 0.81652

数据可视化

一些基本的原则

1. 需要事先明确可视化的具体目标

  • 探索性可视化
  • 解释性可视化

2. 需要考虑数据和受众群体的特点

  • 哪些变量最重要最有趣
  • 受众方面要考虑阅读者的角色和知识背景
  • 选择合适的映射方式

3. 在传送足够信息前提下保持简洁

映射的图形元素

  1. 坐标位置
  2. 线条
  3. 尺寸
  4. 色彩
  5. 形状
  6. 文字

R语言中的可视化函数

R语言中的可视化函数

  • graphics
  • lattice
  • ggplot2

基本绘图函数

plot(cars$dist~cars$speed)

基本绘图函数

plot(cars$dist,type='l')

基本绘图函数

plot(cars$dist,type='h')

基本绘图函数

hist(cars$dist)

lattice包

library(lattice)
num <- sample(1:3,size=50,replace=T)
barchart(table(num))

lattice包

qqmath(rnorm(100))

lattice包

stripplot(~ Sepal.Length | Species, data = iris,layout=c(1,3))

lattice包

densityplot(~ Sepal.Length ,groups=Species, data = iris,plot.points=FALSE)

lattice包

bwplot(Species~ Sepal.Length, data = iris)

lattice包

xyplot(Sepal.Width~ Sepal.Length ,groups=Species, data = iris)

lattice包

splom(iris[1:4])

lattice包

histogram(~ Sepal.Length | Species, data = iris,layout=c(1,3))

lattice包的三维图形

library(plyr)
func3d <- function(x,y) {
  sin(x^2/2 - y^2/4) * cos(2*x - exp(y))
}
vec1 <- vec2 <- seq(0,2,length=30)
para <- expand.grid(x=vec1,y=vec2)
result6 <- mdply(.data=para,.fun=func3d)

lattice包的三维图形

library(lattice)
wireframe(V1~x*y,data=result6,scales = list(arrows = FALSE),
          drape = TRUE, colorkey = F)

ggplot2包

Data和Mapping以及几何对象Geom

library(ggplot2)
p <- ggplot(data=mpg,mapping=aes(x=cty,y=hwy)) + geom_point()
print(p)

ggplot2包

观察内部结构

summary(p)
data: manufacturer, model, displ, year, cyl, trans, drv, cty, hwy, fl, class [234x11]
mapping:  x = cty, y = hwy
faceting: facet_null() 
-----------------------------------
geom_point: na.rm = FALSE 
stat_identity:  
position_identity: (width = NULL, height = NULL)

ggplot2包

增加其它的数据映射

p <- ggplot(data=mpg,mapping=aes(x=cty,y=hwy,colour=factor(year)))
p <- p + geom_point()
print(p)

ggplot2包

增加统计变换Stat

p <- ggplot(data=mpg,mapping=aes(x=cty,y=hwy,colour=factor(year)))
p <- p + stat_smooth()
print(p)

ggplot2包

在图层Layer中增加点和平滑线

p <- ggplot(data=mpg,mapping=aes(x=cty,y=hwy)) +
     geom_point(aes(colour=factor(year))) + 
     stat_smooth()

ggplot2包

标度Scale控制

p <- ggplot(data=mpg,mapping=aes(x=cty,y=hwy)) +
     geom_point(aes(colour=factor(year))) + 
     stat_smooth()+
     scale_color_manual(values=c('blue2','red4'))

ggplot2包

分面Facet控制

p <- ggplot(data=mpg,mapping=aes(x=cty,y=hwy)) +
     geom_point(aes(colour=factor(year))) + 
     stat_smooth()+
     scale_color_manual(values=c('blue2','red4'))+
     facet_wrap(~ year,ncol=1)

ggplot2包

精雕细琢

p <- ggplot(data=mpg, mapping=aes(x=cty,y=hwy))+
      geom_point(aes(colour=class,size=displ),
               alpha=0.5,position = "jitter")+
      stat_smooth()+
      scale_size_continuous(range = c(4, 10))+
      facet_wrap(~ year,ncol=1)+
      labs(title='汽车型号与油耗',
           y='每加仑高速公路行驶距离',
         x='每加仑城市公路行驶距离',
         size='排量',
         colour = '车型')

进一步学习

直方图

library(ggplot2)
p <- ggplot(data=iris,aes(x=Sepal.Length))+ 
     geom_histogram()
print(p)

直方图

上面的图形不够生动,我们可以调整一些参数,使之变得不一样

p <- ggplot(iris,aes(x=Sepal.Length))+ 
     geom_histogram(binwidth=0.1,   # 设置组距
                   fill='skyblue', # 设置填充色
                   colour='black') # 设置边框色

直方图加密度曲线

直方图的作用主要是展现分组计数和分布特性,因为考查一个样本是否符合某个分布在传统统计学中有着重要的意义。不过有另一种方法也可以展现数据的分布,即核密度估计曲线。简单来说就是根据数据估算一条可以代表其分布的密度曲线。我们可以将直方图和密度曲线重叠显示。

p <- ggplot(iris,aes(x=Sepal.Length)) +
     geom_histogram(aes(y=..density..),
                    fill='skyblue',
                   color='black') +
    stat_density(geom='line',color='black',
                 linetype=2,adjust=2)

密度曲线

adjust参数和窗宽参数类似,它将会控制密度曲线的细节表现能力。我们来尝试用不同的参数绘制多条密度曲线。可见参数越小曲线越为波动灵敏,adjuct负责控制这个参数。

p <- ggplot(iris,aes(x=Sepal.Length)) +
     geom_histogram(aes(y=..density..), # 注意要将y设为相对频数
                   fill='gray60',
                   color='gray') +
    stat_density(geom='line',color='black',linetype=1,adjust=0.5)+
    stat_density(geom='line',color='black',linetype=2,adjust=1)+
    stat_density(geom='line',color='black',linetype=3,adjust=2)

密度曲线

密度曲线还方便对不同数据进行比较,例如我们要对iris中三种不同花的Sepal.Length分布进行比较,可以象下面一样:

p <- ggplot(iris,aes(x=Sepal.Length,fill=Species)) +
     geom_density(alpha=0.5,color='gray')
print(p)

箱线图

除了直方图和密度图,还可以用常见的箱线图来表现一维数据的分布。箱线图也方便各组数据之间的比较。

p <- ggplot(iris,aes(x=Species,y=Sepal.Length,fill=Species)) +
     geom_boxplot()
print(p)

小提琴图

与箱线图类似是小提琴图,它包含了更多关于数据分布的情况

p <- ggplot(iris,aes(x=Species,y=Sepal.Length,fill=Species)) +
     geom_violin()
print(p)

小提琴图叠加点图

p <- ggplot(iris,aes(x=Species,y=Sepal.Length,
                     fill=Species)) +
     geom_violin(fill='gray',alpha=0.5)+
     geom_dotplot(binaxis = "y", stackdir = "center")

条形图

mpg数据集中各车型所比例,以及在这些车型中各年份所占的比例。

p <- ggplot(mpg,aes(x=class))+
            geom_bar()
print(p)

叠加条形图

mpg数据集中各车型所比例,以及在这些车型中各年份所占的比例。

mpg$year <- factor(mpg$year)
p <- ggplot(mpg,aes(x=class,fill=year))+
            geom_bar(color='black')
print(p)

叠加条形图

并排放置的叠加条形图

p <- ggplot(mpg,aes(x=class,fill=year))+
     geom_bar(color='black',
             position=position_dodge())
print(p)

相对比例条形图

p <- ggplot(mpg,aes(x=class,fill=year))+
     geom_bar(color='black',
              position='fill') 
print(p)

饼图

p <- ggplot(mpg, aes(x = factor(1), fill = factor(class))) +
     geom_bar(width = 1)+ 
      coord_polar(theta = "y")
print(p)

玫瑰图

风向风速玫瑰图(wind rose),它是气象学家常用的图形工具,描述了在一个特定的地点,其风速和风向是如何分布的

set.seed(1)
#随机生成100次风向,并汇集到16个区间内
dir <- cut_interval(runif(100,0,360),n=16)
#随机生成100次风速,并划分成4种强度
mag <- cut_interval(rgamma(100,15),4) 
sample <- data.frame(dir=dir,mag=mag)
#将风向映射到X轴,频数映射到Y轴,风速大小映射到填充色,生成条形图后再转为极坐标形式即可
p <- ggplot(sample,aes(x=dir,fill=mag))+
      geom_bar()+ coord_polar()

马赛克图

将数据按不同变量划分,然后用不同面积大小的矩形来表示不同组别数据。泰坦尼克号沉没事件中,有哪些人生存下来?

library(vcd)
mosaic(Survived~ Class+Sex, data = Titanic,shade=T, 
       highlighting_fill=c('red4',"skyblue"),
       highlighting_direction = "right")

层次树图

是用不同尺寸的嵌套矩形来表现层次数据。最常见的层次数据包括了文件目录、文章结构、组织结构等等。对苹果公司财务报表的可视化。

library(treemap)
data <- read.csv('data/apple.csv',T)
treemap(data,
       index=c("item", "subitem"),
       vSize="time1206",
       vColor="time1106",
       type="comp",
       title='苹果公司财务报表可视化',
       palette='RdBu')

连续数据的比例结构

data <- read.csv('data/soft_impact.csv',T)
library(reshape2)
data.melt <- melt(data,id='Year')
p <- ggplot(data.melt,aes(x=Year,y=value,
                          group=variable,fill=variable))+
     geom_area(color='black',size=0.3,
               position=position_fill())+
     scale_fill_brewer()

3D图形

#library(rgl)
x <- sort(rnorm(1000))
y <- rnorm(1000)
z <- rnorm(1000) + atan2(x,y)
plot3d(x, y, z, col=rainbow(1000))

testglsnapshot
You must enable Javascript to view this page properly.

其他

  • REmap – 动态地图
  • bigvis – 大数据集的可视化
  • ggsci – 为ggplot2提供科技期刊所用的绘图风格
  • rCharts – 生成动态交互图

推荐图书

  • ggplot2:数据分析与图形艺术

  • R数据可视化手册