R语言小白学习笔记4—统计图
笔记链接
学习笔记1—R语言基础.
学习笔记2—高级数据结构.
学习笔记3—R语言读取数据.
学习笔记4—统计图
数据分析的难点之一是数据可视化,R语言的基础安装包和插件包(如lattice和ggplot2)都能提供优秀的数据可视化能力。
4.1 基础统计图
展示图片前需要一些数据,这里用ggplot2包中的数据。
首先加载包,然后导入diamonds数据:
> library(ggplot2)
> data(diamonds)
> head(diamonds)
# A tibble: 6 x 10
carat cut color clarity depth table price x y
<dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl>
1 0.23 Ideal E SI2 61.5 55 326 3.95 3.98
2 0.21 Prem~ E SI1 59.8 61 326 3.89 3.84
3 0.23 Good E VS1 56.9 65 327 4.05 4.07
4 0.290 Prem~ I VS2 62.4 58 334 4.2 4.23
5 0.31 Good J SI2 63.3 58 335 4.34 4.35
6 0.24 Very~ J VVS2 62.8 57 336 3.94 3.96
# ... with 1 more variable: z <dbl>
4.1.1基础直方图
单变量数据最常用的图表是直方图,直方图展示数据的分布。
这里展示diamonds数据集的carat列:
> hist(diamonds$carat, main="Carat Histogram", xlab="Carat")
其中标题用main参数设置,x轴用xlab参数设置:
复杂的直方图用ggplot2包创建更简单。
4.1.2基础散点图
比较两个变量适合采用散点图。
下面绘制diamonds数据集的价格(price)和carat的散点图:
> plot(price ~ carat, data=diamonds)
符号~代表:y为price,x为carat
也可以不用符号~,直接简单指定x变量和y变量:
> plot(diamonds$carat, diamonds$price)
4.1.3箱线图
R语言用boxplot函数绘制箱线图:
> boxplot(diamonds$carat)
箱线图的原理是用箱内中间粗的中间线代表数据的中位数,箱的边界是第一和第三分位。
也就是说,50%的数据(四分位差,IQR)都集中在箱内。并且,向上下各延伸出1.5倍的IQR长度的线,在这两条平行线之外的数据称为异常点。
4.2 ggplot2
使用ggplot2软件包很容易用颜色、形状或者大小来描述数据,添加图例注释也很简单,构建图表也很快。
ggplot2使用ggplot函数开始构建初始图层,其中第一个参数传入数据。
初始化图层后通过**"+"符号来增加图层**。其中使用aes函数指定数据映射的轴或者其他图形元素。
4.2.1 ggplot2:直方图和核密度曲线
直方图:
用ggplot函数和geom_histogram函数绘制diamonds的carat变量分布图,因为是一维,所以只设置x轴一个图形映射:
> ggplot(data=diamonds) + geom_histogram(aes(x=carat))
核密度曲线:
使用geom_density函数,fill参数指定图填充的颜色,与后边的color参数不同:
> ggplot(data=diamonds) + geom_density(aes(x=carat), fill="grey50")
直方图显示数据的数量,核密度曲线表示的是关注的变量落在滑窗内的观测数据的概率。
直方图是离散变量的度量,而核密度曲线是连续变量的度量。
4.2.2 ggplot2:散点图
先绘制简单的散点图:
和之前相同,使用ggplot函数初始化图层,但这次将aes函数放入ggplot函数内。
> ggplot(data=diamonds, aes(x=carat, y=price)) + geom_point()
因为下边会不断使用ggplot(data=diamonds, aes(x=carat, y=price)),所以可以使用一个对象:
> g <- ggplot(data=diamonds, aes(x=carat, y=price))
接下来加入g变量重新画散点图,加入color变量,将其映射到图形的color属性:
> g + geom_point(aes(color=color))
这里color=color代表图的颜色由数据决定。
这里不理解的可以看上节diamonds的数据集,里边是有各个变量的。
绘制分面图:
绘制分面图需要使用facet_wrap函数或者facet_grid函数。
facet_wrap函数根据传入的变量水平(level)将数据切分,并将切分后的数据绘制到不同的面板中:
> g + geom_point(aes(color=color)) + facet_wrap(~color)
facet_gird函数与facet_wrap类似,但它把变量的所有水平分配到行或者列上:
> g + geom_point(aes(color=color)) + facet_grid(cut~clarity)
左上面板显示数据集diamonds中Fair cut与I1 clarity的散点图。
右边面板是Fair cut与SI2 clarity的散点图。
第二行第一列的面板是Good cut与I1 clarity的散点图。
分面图对于直方图或者其他几何图形也适用:
> ggplot(diamonds, aes(x=carat)) + geom_histogram() + facet_wrap(~color)
4.2.3:箱线图和小提琴图
ggplot2提供了geom_boxplot函数绘制箱线图,尽管它只是y轴的一维图形,但有时也会添加x轴,此时设为1:
> ggplot(diamonds, aes(y=carat, x=1)) + geom_boxplot()
继而可以根据变量的level在同一面板绘制多个箱线图:
> ggplot(diamonds, aes(y=carat, x=cut)) + geom_boxplot()
使用geom_violin函数可以绘制小提琴图:
> ggplot(diamonds, aes(y=carat, x=cut)) + geom_violin()
小提琴图和箱线图类似,除了箱边界采用的是曲线之外,它表示数据的核密度。
可以在同一幅图中使用多个图层:
数据点在小提琴图下边:
> ggplot(diamonds, aes(y=carat, x=cut)) + geom_point() + geom_violin()
数据点在小提琴图上边:
> ggplot(diamonds, aes(y=carat, x=cut)) + geom_violin() + geom_point()
4.2.4 ggplot2:曲线图
曲线图经常用来描述一个连续的变量。
绘制economics数据的曲线:
> ggplot(economics, aes(x=date, y=pop)) + geom_line()
绘制曲线图中最常见的任务是显示多个年份里每年的指标。
这里用lubridate包来展现economics数据,其中有方便的函数处理日期变量。
先创建两个变量:year和month,为了简单起见,采用2000年起的数据:
> economics$year <- year(economics$date)
> economics$month <- month(economics$date, label=TRUE)
> econ2000 <- economics[which(economics$year >= 2000), ]
> library(scales)
> g <- ggplot(econ2000, aes(x=month, y=pop))
> g <- g + geom_line(aes(color=factor(year), group=year))
#为每年绘制曲线图并上色,这里将year变量转换为factor,得到离散的色阶
> g <- g + scale_color_discrete(name="Year")
#命名标尺
> g <- g + scale_y_continuous(labels = comma)
#格式化y轴标度
> g <- g + labs(title = "Population Growth", x="Month", y="Population")
#设置x轴标签、y轴标签和标题
> g
4.2.5主题
ggplot2的一大优势是可以设置主题来轻松改变图形的外观。这里采用ggthemes包里的主题。
样式1:The Economist
> library(ggthemes)
> g2 <- ggplot(diamonds, aes(x=carat, y=price)) + geom_point(aes(color=color))
> g2 + theme_economist() + scale_colour_economist()
样式2:Excel
> g2 + theme_economist() + scale_colour_economist()
样式3:Edward Tufte
> g2 + theme_tufte()
样式4:Wall Street Journal
> g2 + theme_wsj()