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$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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值