本文首发于“生信补给站”公众号 https://mp.weixin.qq.com/s/UMuZ1MiuKDheHk9mwA9EXA
五 统计变换(Statistics)
ggplot2提供了多种统计变换方式,此处介绍两种较常用的。
1 stat_summary
要求数据源的y能够被分组,每组不止一个元素, 或增加一个分组映射,即aes(x= , y = , group = )
library(Hmisc) g <- ggplot(mtcars,aes(cyl, mpg)) + geom_point() #mean_cl_bool对mpg进行运算,返回均值,最大值,最小值;其他可用smean.cl.normal,smean.sdl,smedian.hilow。 g + stat_summary(fun.data = "mean_cl_boot", color = "red", size = 2)
#fun.y 对y的汇总函数,返回单个数字,y通常会被分组汇总后每组返回1个数字
g + stat_summary(fun.y = "mean", color = "red", size = 2, geom = "point") # 计算各组均值
# 增加1组颜色变量映射,然后求均值并连线
g + aes(color = factor(vs)) + stat_summary(fun.y = mean, geom = "line")
#fun.ymax 表示取y的最大值,输入数字向量,每组返回1个数字
g + stat_summary(fun.y = mean, fun.ymin = min, fun.ymax = max, color = "red") # 计算各组均值,最值
2 stat_smooth
对原始数据进行某种统计变换计算,然后在图上表示出来,例如对散点图上加一条回归线。
#添加默认曲线
#method 表示指定平滑曲线的统计函数,如lm线性回归, glm广义线性回归, loess多项式回归,
gam广义相加模型(mgcv包), rlm稳健回归(MASS包) ggplot(mpg, aes(displ, hwy)) +geom_point() +stat_smooth() ggplot(mpg, aes(displ, hwy)) +geom_point() +geom_smooth() +stat_smooth(method = lm, se = TRUE)
#formula 表示指定平滑曲线的方程,如 y~x, y~poly(x, 2), y~log(2) ,需要与method参数搭配使用
ggplot(mpg, aes(displ, hwy)) +geom_point() +stat_smooth(method = lm, formula = y ~ splines::bs(x, 3), se = FALSE)
#se 表示是否显示平滑曲线的置信区间,默认TRUE显示;level = 0.95
ggplot(mpg, aes(displ, hwy, color = class)) + geom_point() + stat_smooth(se = FALSE, method = lm)
注:以下为ggplot2提供的其他统计变换方式,也可以自己写函数基于原始数据进行计算。
stat_abline stat_contour stat_identity stat_summary stat_bin stat_density stat_qq stat_summary2d stat_bin2d stat_density2d stat_quantile stat_summary_hex stat_bindot stat_ecdf stat_smooth stat_unique stat_binhex stat_function stat_spoke stat_vline stat_boxplot stat_hline stat_sum stat_ydensity
六 坐标系统(Coordinante)
坐标系统控制坐标轴,可以进行变换,例如XY轴翻转,笛卡尔坐标和极坐标转换,以满足我们的各种需求。
1 coord_flip()实现坐标轴翻转
ggplot(diamond)+geom_bar(aes(x=cut, fill=cut))+coord_flip()
2 coord_polar()实现极坐标转换
#靶心图
ggplot(diamond)+geom_bar(aes(x=factor(1), fill=cut))+coord_polar()
#饼图
ggplot(diamond)+geom_bar(aes(x=factor(1), fill=cut))+coord_polar(theta="y")
#风玫瑰图(windrose)
ggplot(diamond)+geom_bar(aes(x=clarity, fill=cut))+coord_polar()