目录
ggplot作图语法
散点图
折线图
group分组
face_wrap()图像切片摆放
facet_grid()交叉分组切片
条形图
2.1 单组变量条形图
2.2 多维展示变量
直方图有与密度估计
直方图
密度估计图
..density..语法和stat=“density”
ggplot作图语法
ggplot作图是将数据按需要进行映射aes(x,y,color,fill,size...,),并将若干个几何图像以图层形式进行叠加,并设置合适的刻度scale和坐标系,添加标题等完善作图。每个几何图像内还可以额外指定映射。
每维映射有一个scale刻度控制其坐标、数据展示。要修改其默认刻度,使用scale_xx_xx(),语法为scal_维数_类型。“类型”包括continuous、discrete、log10。
如scale_x_continuous(limits,breaks,labs)用于设置x轴范围、刻度、标签
散点图
# 加载包和准备数据集
# gapminder包中gapminder数据集记录了多个国家地区期望寿命和人均jdp数据
library('ggplot2')
library('gapminder')
head(gapminder,5)# ——————第一步——————
# 将数据输入ggpllot函数并按需将变量映射到x、y以及其它属性如颜色color进行分类
p<-ggplot(data = gapminder,mapping=aes(x= gdpPercap,y= lifeExp,color = continent # 将大洲变量映射到颜色维))
# Note: 使用+号连接
# ——————第二步——————
# 选择将导入ggplot的数据以那种形式展现
# 依次是:1.用散点图geom_point展示
# 2.再加上个拟合曲线图geom_smoth,拟合方法有gam、lm
# !!!还有多个可选参数如color, 显示置信域se , size, 透明度alpha、linetype线类型
p1<- p + geom_point() + geom_smooth(method = 'gam')
# ——————第三步——————
# 设置适当的坐标系统
# 为什么?:原坐标系数据多集中在0-30000gdp,严重右偏,对数化x轴scale_x_log10()改善观感
# Note: geom_smooth()的拟合计算是在对数变换之后进行的
# Note: 此外,希望x轴标签采用美元单位,避免不同包有相函数,使用包::函数
p1<-p1 + scale_x_log10(labels=scales::dollar)
# ——————第四步——————
# 设定标题和图例位置等
p1<-p1 + labs(x = "人均GDP",y = "期望寿命(年数)",title = "经济增长与期望寿命",subtitle = "数据点为每个国家每年",caption = "数据来源: gapminder"
)# Note: 此外,geom_point()等geom_XXXX()函数中可以单独使用mapping=aes(color=continent)
# Note: 这样的话齐对continent分组效果智慧作用于该图形如point,其它图形如smoth这不会被影响,
# 导致结果就是smoth图中不分别对continent大洲进行分别拟合
p1
数据集
作图结果
折线图
group分组
# 加载包和准备数据集
# gapminder包中gapminder数据集记录了多个国家地区期望寿命和人均jdp数据
library('ggplot2')
library('gapminder')
head(gapminder,5)# 将数据输入ggpllot函数并按需将变量映射到x、y并利用group根据country进行分组
p<-ggplot(data = gapminder,mapping=aes(x= year,y= lifeExp,group = country))
#根据映射好的数据进行绘图
p + geom_line()
注意到有一个国家从 1990-2000出现极大剧烈的波动,希望筛选出来展示:
# 加载包和准备数据集
# gapminder包中gapminder数据集记录了多个国家地区期望寿命和人均jdp数据
library('ggplot2')
library('gapminder')
head(gapminder,5)library(dplyr)
# 筛选出这个国家的数据输入ggplot完成数据x,y映射
some_country<-filter(gapminder,lifeExp < 30, year >= 1990)# 该国家为Rwanda
p<-ggplot(data = filter(gapminder,country ==some_country[['country']] ),# 也可以some_country$countrymapping=aes(x= year,y= lifeExp,))
#根据映射好的数据进行绘图
p + geom_line() +geom_point()# 每个数据点用散点标出# note: 如果mapping映射的变量是因子型或字符型,会起到分组作用,在没有显示group=情况下,
# 只能在组内根据数据连线,因此例如若year是字符型或因子,折线不会出现。
# note: geom_area()作类似图形, 纵坐标从0开始
tibble[[]] 和 tibble$country区别
> some_country[c('country')] # A tibble: 1 × 1country<fct> 1 Rwanda > some_country$country [1] Rwanda 142 Levels: Afghanistan Albania Algeria Angola Argentina ... Zimbabwe
face_wrap()图像切片摆放
# 加载包和准备数据集
# gapminder包中gapminder数据集记录了多个国家地区期望寿命和人均jdp、年份数据
library('ggplot2')
library('gapminder')
head(gapminder,5)# 按照不同大洲对期望寿命和年份进行切片
p<-ggplot(gapminder,mapping= aes(x=year,y=lifeExp,# group = country,因为不希望smoth对每个国家分组进行分别拟合,需要单独在line中group
)) + geom_line(mapping = aes(group = country),color = "gray") +geom_smooth(method = "loess",color="cyan",se=FALSE,size=1.1) +# 按照大洲切片,每行2个图facet_wrap(~continent,ncol=2) + labs(x = "年份",y = "期望寿命",title = "五个大洲各国期望寿命变化趋势")p
facet_grid()交叉分组切片
p_else + facet_grid(a~b) #按照a、b交叉分组对图片进行分别展示
条形图
条形图(barplot)反映分类变量的频数分布或者比例
2.1 单组变量条形图
# socviz中gss_sm数据集是美国社会调查数据
library(socviz)
head(gss_sm)
# Note: ggplot2中的条形图函数geom_bar(),只需要x一个映射可以对一个分类变量调用一个默认函数自动统计频数
# 建议统计好频数,仅用ggplot绘图
# 现在希望展示出每个bigregin分别有多少受访者# 首先得出频数数据
library(dplyr)
library(tidyverse)
# 管道语法‘|>’,将数据传递到下一次调用
dataCount <- gss_sm|>select(bigregion) |> # dplyr 选择bigregion列count(bigregion) |> # tidyverse 计算分类频数mutate(ratio = n/sum(n)) # dplyr 增加新列表示占总bigregion比例
dataCount
# Note:geom_col是另一种bar图,不同于geom_bar,geom_col可以将用户输入的数据表示高度
# 而不是自动计算,需要x、y两个映射
p<-ggplot(dataCount,aes(x=bigregion,y=n,fill=bigregion))+geom_col()+labs(y="Count")
p
# Note: + theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1))横轴label45度摆放
# Note: + coord_flip()将x轴和y轴互换,实现条形图横放
# Note: + guides(fill = "none")去除fill维产生右侧图例
2.2 多维展示变量
library(socviz)
library(dplyr)
head(gss_sm)
d1 <- gss_sm |>select(bigregion,religion) |> # dplyr 选择列group_by(bigregion,religion)|> # dply 分组summarise(count_n = n(),.groups = "drop_last")|> # count_n作为返回变量的名字,n() 给出当前分组的size.drop_last去掉最后一级分组即religionmutate(ratio = count_n/sum(count_n)) # 增加占比数据列(或称变量)library(ggplot2)
p<- ggplot(d1,aes(x = bigregion,y = count_n ,fill = religion
))
p+geom_col() # position = "stack"也是geom_col()函数的默认选项
#...
# 侧重于比较每个大类内部
# "fill"标准化堆叠:将每个条形图的总高度标准化为 1,展示各组在总量中的相对比例
p+geom_col(position="fill") + labs(y=NULL)
# "dodge"将条形图并排显示。条形图保持原y轴映射的变量,表现每个交叉类的频数。
p+geom_col(position="dodge")
# coord_flip()横向展示条形图
p+geom_col(position="stack")+coord_flip()
此外,还可以利用切片+facet_grid(v~w)展示条形图.
直方图有与密度估计
直方图
直方图(histogram)反映连续变量的分布.
# midwest数据集包含了美国中西部的一些县的统计数据
head(midwest)
p<-ggplot(midwest,aes(x=area))
p + geom_histogram() # bins分组数、binwidth分组宽度
密度估计图
ggplot(midwest, aes(x = area, color = state,# 线条颜色fill = state # 填充颜色)) +geom_density(alpha = 0.3)
# geom_line(stat="density")# 使用密度估计统计变换,绘制数据的密度曲线。
做在同一ggplot上,要同时将直方图y轴计数转换为密度表示
ggplot(midwest, aes(x = area)) +geom_histogram(mapping = aes(y = ..density..), alpha = 0.6) +geom_density(size = 1.1)
..density..语法和stat=“density”
stat参数负责根据传入的函数将数据根据某种统计量计算方法计算出值。stat="density",调用stat_density()计算结果
.
..density.. 是一种特殊的语法,例如 geom_histogram( mapping = aes(y = ..density..) 用于在 aes() 中引用由 stat_bin() 计算出的密度值,并将其轴转换为密度density。