一小时掌握R语言数据可视化
展开一张画布
ggplot2和其他作图工具不同,它是以图层覆盖图层的方式画出一个完美图像的,就像是photoshop里的图层,那么首先我们得有一张画布(如果没有安装R语言和ggplot2请见《十八-R语言特征工程实战》)
[root@centos $] R
> library(ggplot2)
> ggplot()
使用geom_abline、geom_hline、geom_vline画直线
下面我们来在这张画布上画一条横线:
> ggplot() + geom_hline(yintercept = 5)
我们也可以画一条竖线
> ggplot() + geom_vline(xintercept = 5)
当然我们也可以画斜线,
> geom_abline(intercept = 2.5, slope=1)
本应该画一条斜率为1,截距为2.5的斜线,但是因为画布不会自动移动到这条直线所在的位置,所以我们要实现几个点来定位一下画布,那么怎么画点呢,我们先来研究一下
使用geom_point画点
下面我们来一张空画布上画一个点,画点和画线不同在于:线可以指定一个x或y的截距就可以了,可以作为一个简单的参数传给geom_hline或geom_vline,但是画点涉及到的是一些x、y的数据值,ggplot是把数据和作图撇清的,也就是数据是数据,成像是成像
我们先来构造点:
> x <- c(1,2,3)
> y <- c(1,3,4)
> data <- data.frame(x,y)
> str(data)
'data.frame': 3 obs. of 2 variables:
$ x: num 1 2 3
$ y: num 1 3 4
我们其实构建了一个frame,里面包含了三个点:(1,1), (2,3), (3,4)
那么如果要画出这些点的话应该这样:
> ggplot(data, aes(x = x, y = y)) + geom_point()
前面是声明数据部分,后面是声明怎么成像
下面我们开始调整geom_point的参数,比如展示不同的颜色(左),和展示不同的形状(右)
> ggplot(data, aes(x, y)) + geom_point(aes(colour = factor(y)))
> ggplot(data, aes(x, y)) + geom_point(aes(shape = factor(y)))
如果颜色不是按factor区分,而是按连续值来区分,那么就是渐变形式,即
> ggplot(data, aes(x, y)) + geom_point(aes(colour = y))
还可以展示不同的大小,可以固定大小(左),也可以根据数据确定大小(右)
> ggplot(data, aes(x, y)) + geom_point(aes(size = 3))
> ggplot(data, aes(x, y)) + geom_point(aes(size = y))
这里我们要说明一下aes的作用,看下面两个用法(如图左、右):左边的含义就是画红色点,右边是按照指定的一个维度展示不同的颜色
> ggplot(data, aes(x, y)) + geom_point(colour="red")
> ggplot(data, aes(x, y)) + geom_point(aes(colour="red"))
接着上面划线一节,我们在已经画了点的画布上再画一条斜线:一条斜率为1,截距为1的直线,也就是y=x+1,那么一定是经过(2,3),(3,4)两个点的
> ggplot(data, aes(x, y)) + geom_point(aes(colour = y)) + geom_abline(slope = 1, intercept = 1)
使用geom_bar来画直方图
直观上看,直方图是表达一种累积量,因此默认的直方图的高度是counts或sum,也就是像下面这样子:因为我们的x只有1、2、3单独的三个值,所以直接geom_bar()高度相同,但如果判断x<2,那么有一个满足,两个不满足,所以高度分别是1和2
> ggplot(data, aes(x)) + geom_bar()
> ggplot(data, aes(x<2)) + geom_bar()
当然我们可以自己指定直方图的高度的计算方法,以下两种方法效果相同
> ggplot(data, aes(x)) + geom_bar(aes(weight=y))
> ggplot(data, aes(x,y)) + geom_bar(stat = "identity")
如果我们想要把多种取值的统计数目累加显示在柱状图上,可以这样:这里面对同一个x,不同y出现总数不一样,累加起来就像下图展示,其中如果y是数字,那么想把他当成类别,需要转成factor
> x <- rep(c(1,2), c(2,3))
> y <- rep(c(3,2), c(1,4))
> data <- data.frame(x,y)
> ggplot(data, aes(x)) + geom_bar(aes(fill=factor(y)))
当然我们也可以不简单堆叠起来,比如扁平放置(左),或拉伸至顶部(右)
> ggplot(data, aes(x)) + geom_bar(aes(fill=factor(y)), position="dodge")
> ggplot(data, aes(x)) + geom_bar(aes(fill=factor(y)), position="fill")
利用geom_density画概率密度曲线
概率密度就是某些值出现的频次多少的一个曲线,并做平滑,如下:
> x <- rep(c(1,3,7,11,23,50,60),c(1,30,400,60,4,55,11))
> y <- rep(c(1,3,7,11,23,50,60),c(1,30,400,60,4,55,11))
> data <- data.frame(x,y)
> ggplot(data, aes(x)) + geom_density()
我们可以调整平滑的宽度:
> ggplot(data, aes(x)) + geom_density(adjust = 1/5)
如果我们想按照不同的y值来分开画密度图,并且用不同颜色来表示不同的y值,那么我们可以用描边的方式(左),也可以用填充的方式(中),当然也可以两者结合
> ggplot(data, aes(x, colour = factor(y))) + geom_density(adjust = 1/5)
> ggplot(data, aes(x, fill = factor(y))) + geom_density(adjust = 1/5)
> ggplot(data, aes(x, colour = factor(y), fill = factor(y))) + geom_density(adjust = 1/5, alpha = 0.1)
和柱状图一样,我们也可以通过geom_density的position参数来显示累计情况:
> ggplot(data, aes(x, fill = factor(y))) + geom_density(adjust = 1/5, position='fill')
> ggplot(data, aes(x, fill = factor(y))) + geom_density(adjust = 1/5, position='stack')
用geom_text和geom_label写标注文本
为了让图像更清晰,我们需要把关键数据打上标签展示出来,我们可以这样做:
> ggplot(data, aes(x, y, label=rownames(data))) + geom_point(aes(colour = y)) + geom_abline(slope = 1, intercept = 1) + geom_text(check_overlap = TRUE)
> ggplot(data, aes(x, y, label=rownames(data))) + geom_point(aes(colour = y)) + geom_abline(slope = 1, intercept = 1) + geom_label()
总结
本节介绍了ggplot作图原理以及基本的几种作图方式,基于这些知识相信你很容易能做出精美的图像了