目录
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$country
mapping=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 × 1 country <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去掉最后一级分组即religion
mutate(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。