您的位置:首页 > 新闻 > 热点要闻 > ggplot作图基础

ggplot作图基础

2025/3/11 3:35:10 来源:https://blog.csdn.net/weixin_53456019/article/details/140912370  浏览:    关键词:ggplot作图基础

目录

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。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com