写在前面
ggplot2 是一个基于 R 语言的数据可视化包,提供了一种结构化的方法来描述和构建图表,因此被广泛用于制作可视化图表。其是tidyverse数据科学生态系统的一部分。
在 ggplot2 中,每一个图形都是从数据映射到美学属性(如颜色、形状和大小)、加上几何对象(如点、线和条形图)、统计变换和坐标系等元素组合而成。这种分层和模块化的方法使得用户可以灵活地创建复杂的图表,同时保持代码的可读性和易用性。通过ggplot2,你可以创建各种图表:包括但不限于散点图、线图、直方图、条形图和箱线图。此外,ggplot2 提供了广泛的自定义选项,允许用户调整几乎图表的每个细节,以适应具体的展示需求。
简而言之,ggplot2 是 R 语言中一个功能强大且灵活的数据可视化工具。因此,本文主要学习如何在R语言中通过ggplot2来绘制条形图、堆积图、饼图、直方图、核密度图、箱图、小提琴图。
完整R语言教程和测试数据可见:R语言基础学习手册
6.1 条形图
以 vcd 包中的Arthritis数据框为例:
install.packages("vcd")
读取该数据框,使用函数为:
data_frame <- package_name::data_frame_name
library(vcd)
library(grid)
Arthritis <- vcd::Arthritis
Arthritis
## ID Treatment Sex Age Improved
## 1 57 Treated Male 27 Some
## 2 46 Treated Male 29 None
## 3 77 Treated Male 30 None
## 4 17 Treated Male 32 Marked
## 5 36 Treated Male 46 Marked
## 6 23 Treated Male 58 Marked
## 7 75 Treated Male 59 None
## 8 39 Treated Male 59 Marked
## 9 33 Treated Male 63 None
## 10 55 Treated Male 63 None
## 11 30 Treated Male 64 None
## 12 5 Treated Male 64 Some
## 13 63 Treated Male 69 None
## 14 83 Treated Male 70 Marked
## 15 66 Treated Female 23 None
## 16 40 Treated Female 32 None
## 17 6 Treated Female 37 Some
## 18 7 Treated Female 41 None
## 19 72 Treated Female 41 Marked
## 20 37 Treated Female 48 None
## 21 82 Treated Female 48 Marked
## 22 53 Treated Female 55 Marked
## 23 79 Treated Female 55 Marked
## 24 26 Treated Female 56 Marked
## 25 28 Treated Female 57 Marked
## 26 60 Treated Female 57 Marked
## 27 22 Treated Female 57 Marked
## 28 27 Treated Female 58 None
## 29 2 Treated Female 59 Marked
## 30 59 Treated Female 59 Marked
## 31 62 Treated Female 60 Marked
## 32 84 Treated Female 61 Marked
## 33 64 Treated Female 62 Some
## 34 34 Treated Female 62 Marked
## 35 58 Treated Female 66 Marked
## 36 13 Treated Female 67 Marked
## 37 61 Treated Female 68 Some
## 38 65 Treated Female 68 Marked
## 39 11 Treated Female 69 None
## 40 56 Treated Female 69 Some
## 41 43 Treated Female 70 Some
## 42 9 Placebo Male 37 None
## 43 14 Placebo Male 44 None
## 44 73 Placebo Male 50 None
## 45 74 Placebo Male 51 None
## 46 25 Placebo Male 52 None
## 47 18 Placebo Male 53 None
## 48 21 Placebo Male 59 None
## 49 52 Placebo Male 59 None
## 50 45 Placebo Male 62 None
## 51 41 Placebo Male 62 None
## 52 8 Placebo Male 63 Marked
## 53 80 Placebo Female 23 None
## 54 12 Placebo Female 30 None
## 55 29 Placebo Female 30 None
## 56 50 Placebo Female 31 Some
## 57 38 Placebo Female 32 None
## 58 35 Placebo Female 33 Marked
## 59 51 Placebo Female 37 None
## 60 54 Placebo Female 44 None
## 61 76 Placebo Female 45 None
## 62 16 Placebo Female 46 None
## 63 69 Placebo Female 48 None
## 64 31 Placebo Female 49 None
## 65 20 Placebo Female 51 None
## 66 68 Placebo Female 53 None
## 67 81 Placebo Female 54 None
## 68 4 Placebo Female 54 None
## 69 78 Placebo Female 54 Marked
## 70 70 Placebo Female 55 Marked
## 71 49 Placebo Female 57 None
## 72 10 Placebo Female 57 Some
## 73 47 Placebo Female 58 Some
## 74 44 Placebo Female 59 Some
## 75 24 Placebo Female 59 Marked
## 76 48 Placebo Female 61 None
## 77 19 Placebo Female 63 Some
## 78 3 Placebo Female 64 None
## 79 67 Placebo Female 65 Marked
## 80 32 Placebo Female 66 None
## 81 42 Placebo Female 66 None
## 82 15 Placebo Female 66 Some
## 83 71 Placebo Female 68 Some
## 84 1 Placebo Female 74 Marked
6.1.1 简单的条形图
在该数据框中,变量improved记录了对每位接受了安慰剂或药物的病人的治疗效果:
table(Arthritis$Improved)
##
## None Some Marked
## 42 14 28
**table()**函数用于创建频数表(频率表)或列联表,它可以统计向量中每个元素的出现次数。
对Improved变量作简单的条形图:
library(ggplot2)
ggplot(Arthritis,aes(x=Improved))+geom_bar()+
labs(title = "Simple Bar chart",x="Improved",y="Frequency")

将上面的变量图修改为横着的,利用函数**coord_flip()**可以在绘制图形时交换x轴和y轴的方向,从而实现图形的翻转(全称coordinate Flip就是坐标翻转的意思):
library(ggplot2)
ggplot(Arthritis,aes(x=Improved))+geom_bar()+
labs(title = "Horizontal Bar chart",x="Improved",y="Frequency")+
coord_flip()

6.1.2 堆积、分组和填充条形图(柱状图)
例子:比较分别接受了安慰剂(Placebo)或药物(Treated)的病人的治疗效果
table(Arthritis$Improved,Arthritis$Treatment)
##
## Placebo Treated
## None 29 13
## Some 7 7
## Marked 7 21
6.1.2.1 堆积图,对Improved进行堆积,注意position="stack"
library(ggplot2)
ggplot(Arthritis,aes(x=Treatment,fill=Improved))+
geom_bar(position = "stack")+
labs(title="Stacked Bar chart",
x="Treament",y="Frequency")

6.1.2.2 分组图,对Improved进行分组,注意position="dodge":
library(ggplot2)
ggplot(Arthritis,aes(x=Treatment,fill=Improved))+
geom_bar(position = "dodge")+
labs(title="Grouped Bar chart",
x="Treament",y="Frequency")

6.1.2.3 填充条形图,对Improved进行填充,注意position="fill":
与堆积图的差别在于:填充图的纵坐标,即每个条形图的高度为1,段的高度代表百分比
library(ggplot2)
ggplot(Arthritis,aes(x=Treatment,fill=Improved))+
geom_bar(position = "fill")+
labs(title="Filled Bar chart",
x="Treament",y="Frequency")

关于position的设置可以分为以下4种:
1)position="stack"(默认值):将柱子堆叠在一起,形成堆叠柱状图。
2)position="fill":将每个柱子的高度归一化为1,使得每个柱子的面积代表相对比例。这样可以更好地比较不同类别之间的相对频率或比例。
3)position="dodge":将柱子并排显示,以显示不同类别之间的直接比较。每个类别的柱子宽度保持不变。
4)position="identity"(用的少):不对柱子进行任何位置调整,直接使用数据中的数值作为柱子的位置。这通常用于自定义柱状图的位置布局。
6.1.3 均值条形图
6.1.3.1 举例
用R自带数据集state.x77来绘制1970年美国各地区的平均文盲率,数据集state.region具有每个州所属的地区名,看一下state.x77和state.region数据集:
head(state.x77)
## Population Income Illiteracy Life Exp Murder HS Grad Frost Area
## Alabama 3615 3624 2.1 69.05 15.1 41.3 20 50708
## Alaska 365 6315 1.5 69.31 11.3 66.7 152 566432
## Arizona 2212 4530 1.8 70.55 7.8 58.1 15 113417
## Arkansas 2110 3378 1.9 70.66 10.1 39.9 65 51945
## California 21198 5114 1.1 71.71 10.3 62.6 20 156361
## Colorado 2541 4884 0.7 72.06 6.8 63.9 166 103766
state.region
## [1] South West West South West
## [6] West Northeast South South South
## [11] West West North Central North Central North Central
## [16] North Central South South Northeast South
## [21] Northeast North Central North Central South North Central
## [26] West North Central West Northeast Northeast
## [31] West Northeast South North Central North Central
## [36] South West Northeast Northeast South
## [41] North Central South South West Northeast
## [46] South West South North Central West
## Levels: Northeast South North Central West
6.1.3.2 计算不同地区的平均文盲率:
states <- data.frame(state.region,state.x77)
library(dplyr)
plotdata <- states %>%
group_by(state.region)%>%
summarize(mean=mean(Illiteracy))
plotdata
## # A tibble: 4 × 2
## state.region mean
## <fct> <dbl>
## 1 Northeast 1
## 2 South 1.74
## 3 North Central 0.7
## 4 West 1.02
6.1.3.3 作图:
library(ggplot2)
ggplot(plotdata,aes(x=reorder(state.region,mean),y=mean))+
geom_bar(stat = "identity")+
labs(x="region",
y="mean",
title = "Mean Illiteracy Rate")

注意:
1)reorder()函数用于对因子(factor)变量进行重新排序,以便根据另一个变量的值对其进行排序。它通常与aes()函数结合使用,用于设置绘图的变量映射:
reorder(variable, by_variable, FUN = NULL)
variable:是要重新排序的因子变量。被排序者
by_variable是用于排序的参考变量,可以是任何数值型变量或表达式。按什么排序
FUN是一个可选的函数,用于对by_variable进行聚合。默认情况下,它不进行聚合,而是直接使用by_variable的值进行排序。
2)stat = "identity"表示不进行任何统计变换,直接使用原始数据进行绘图。stat还可以设置为:
stat="count":默认选项,根据每个类别的频数(计数)创建柱状图。这是geom_bar的默认统计变换,它会自动对数据进行计数,并使用计数值作为柱子的高度。
stat="bin":将连续变量进行离散化分组,并显示每个分组的频数。这通常用于创建直方图,将连续变量分成多个离散的区间,并显示每个区间中观测值的频数。
stat="density":根据密度估计函数,计算每个类别的密度曲线。这适用于连续变量的柱状图,其中柱子的高度表示密度而不是频数。
stat="summary":根据指定的摘要函数,计算每个类别的摘要统计量,例如均值、中位数等。这对于创建带有摘要统计信息的柱状图很有用。
stat="bin2d":用于创建二维直方图,将两个连续变量分成多个二维的离散区间,并显示每个区间中观测值的频数。
6.1.3.4.带误差线的条形图
1.求SEM=SD/sqrt(n) ,这里用**n=n()**来计算每组组内观测值的数量:
states <- data.frame(state.region,state.x77)
library(dplyr)
plotdata1<- states %>%
group_by(state.region)%>%
summarize(n=n(),
mean=mean(Illiteracy),
SEM=sd(Illiteracy)/sqrt(n))
plotdata1
## # A tibble: 4 × 4
## state.region n mean SEM
## <fct> <int> <dbl> <dbl>
## 1 Northeast 9 1 0.0928
## 2 South 16 1.74 0.138
## 3 North Central 12 0.7 0.0408
## 4 West 13 1.02 0.169
-
作图(带误差线)用函数geom_errorbar(),并用ymin和ymax设置误差线的上下限:
library(ggplot2)
ggplot(plotdata1,aes(x=reorder(state.region,mean),y=mean))+
geom_bar(stat = "identity",fill="skyblue")+
geom_errorbar(aes(ymin=mean-SEM,ymax=mean+SEM),width=0.2)+
labs(x="region",
y="mean",
title = "Mean Illiteracy Rate",
subtitle = "with standard error bars")

6.1.4 条形图的微调
6.1.4.1 颜色
在geom_bar中,fill="color"指定区域颜色,color="color"指定边框颜色。
前面对所有组添加的是同样的颜色,也可以利用**scale_fill_manual(values=c("color1","color2","color3",...))**来手动设定不同组为不同的颜色,例如:
library(ggplot2)
ggplot(Arthritis,aes(x=Treatment,fill=Improved))+
geom_bar(position = "stack",color="black")+
scale_fill_manual(values = c("blue","red","skyblue"))

labs(title="Stacked Bar chart",
x="Treament",y="Frequency")
## $x
## [1] "Treament"
##
## $y
## [1] "Frequency"
##
## $title
## [1] "Stacked Bar chart"
##
## attr(,"class")
## [1] "labels"
6.1.4.2条形图的标签
直接来看例子:
ggplot(mpg,aes(x=model))+
geom_bar()+
labs(title = "Car",y="Frequency",x="")

很显然,x轴的标签全部挤在一起,根本没法看,可以选择转换横纵坐标或者缩小x轴标签的字号并对其旋转一定角度。
1)旋转
ggplot(mpg,aes(x=model))+
geom_bar()+
labs(title = "Car",y="Frequency",x="")+
coord_flip()

2)修改坐标轴的字体字号和旋转角度
ggplot(mpg,aes(x=model))+
geom_bar()+
labs(title = "Car",y="Frequency",x="")+
theme(axis.text.x = element_text(angle = 45,hjust = 1,size = 8))

这里的theme()函数:
axis.text.x: 这指定我们正在自定义绘图中的x轴文本。
element_text(): 这是用于自定义绘图中文本元素(如轴标签、标题和图例)的函数。
angle = 45: 这个参数将x轴文本标签的角度设定为45度。这意味着标签将以顺时针45度的角度旋转。
hjust = 1: horizontal justification的缩写,意为水平对齐方式。0:左对齐;0.5:居中对齐;1:右对齐。
size = 8: 这个参数将x轴文本标签的大小设定为8点。它决定了标签的字体大小。
6.2 饼图
饼图在R中不被重视,故用的不多,函数有限,包括自带的pie() 函数,功能有限;和ggpie包,功能多一些,首先安装ggpie,这里是从github上安装:
if(!require(remotes)) install.packages("remotes")
## 载入需要的程辑包:remotes
remotes::install_github("rkabacoff/ggpie")
## Skipping install of 'ggpie' from a github remote, the SHA1 (0316ac35) has not changed since last install.
## Use `force = TRUE` to force installation
基本语法:
ggpie(data,x,by,offset,percent,lengend,title)
data: 数据框(data frame)或数据集,包含要绘制饼图的数据。
x: 指定饼图的数值变量,它表示每个扇区的大小。
by: 指定饼图的分类变量,它表示每个扇区的类别标签。
offset(可选): 可以用来调整扇区的偏移量,以改变扇区的位置。
percent(可选): 一个逻辑值,用于指定是否在饼图中显示百分比标签。
legend(可选): 一个逻辑值,用于指定是否显示图例。
title(可选):一个字符向量,用于设置饼图的标题。
**举例1:**用mpg数据框中车型的数据制作饼图
library(ggplot2)
library(ggpie)
mpg
## # A tibble: 234 × 11
## manufacturer model displ year cyl trans drv cty hwy fl class
## <chr> <chr> <dbl> <int> <int> <chr> <chr> <int> <int> <chr> <chr>
## 1 audi a4 1.8 1999 4 auto... f 18 29 p comp...
## 2 audi a4 1.8 1999 4 manu... f 21 29 p comp...
## 3 audi a4 2 2008 4 manu... f 20 31 p comp...
## 4 audi a4 2 2008 4 auto... f 21 30 p comp...
## 5 audi a4 2.8 1999 6 auto... f 16 26 p comp...
## 6 audi a4 2.8 1999 6 manu... f 18 26 p comp...
## 7 audi a4 3.1 2008 6 auto... f 18 27 p comp...
## 8 audi a4 quattro 1.8 1999 4 manu... 4 18 26 p comp...
## 9 audi a4 quattro 1.8 1999 4 auto... 4 16 25 p comp...
## 10 audi a4 quattro 2 2008 4 manu... 4 20 28 p comp...
## # ℹ 224 more rows
ggpie(mpg,class)

ggpie(mpg,class,legend = FALSE,offset = 2)

ggpie(mpg,class,year,legend = FALSE,offset = 1.3)

6.3 直方图(展示连续型变量)
6.3.1 语法
ggplot(data,aes(x=连续型变量))+geom_histogram()
6.3.2 用mpg数据框举例
head(mpg)
## # A tibble: 6 × 11
## manufacturer model displ year cyl trans drv cty hwy fl class
## <chr> <chr> <dbl> <int> <int> <chr> <chr> <int> <int> <chr> <chr>
## 1 audi a4 1.8 1999 4 auto(l5) f 18 29 p compa...
## 2 audi a4 1.8 1999 4 manual(m5) f 21 29 p compa...
## 3 audi a4 2 2008 4 manual(m6) f 20 31 p compa...
## 4 audi a4 2 2008 4 auto(av) f 21 30 p compa...
## 5 audi a4 2.8 1999 6 auto(l5) f 16 26 p compa...
## 6 audi a4 2.8 1999 6 manual(m5) f 18 26 p compa...
6.3.2.1 基础直方图
library(ggplot2)
cars2008 <- mpg[mpg$year==2008,]
cars2008
## # A tibble: 117 × 11
## manufacturer model displ year cyl trans drv cty hwy fl class
## <chr> <chr> <dbl> <int> <int> <chr> <chr> <int> <int> <chr> <chr>
## 1 audi a4 2 2008 4 manu... f 20 31 p comp...
## 2 audi a4 2 2008 4 auto... f 21 30 p comp...
## 3 audi a4 3.1 2008 6 auto... f 18 27 p comp...
## 4 audi a4 quattro 2 2008 4 manu... 4 20 28 p comp...
## 5 audi a4 quattro 2 2008 4 auto... 4 19 27 p comp...
## 6 audi a4 quattro 3.1 2008 6 auto... 4 17 25 p comp...
## 7 audi a4 quattro 3.1 2008 6 manu... 4 15 25 p comp...
## 8 audi a6 quattro 3.1 2008 6 auto... 4 17 25 p mids...
## 9 audi a6 quattro 4.2 2008 8 auto... 4 16 23 p mids...
## 10 chevrolet c1500 sub... 5.3 2008 8 auto... r 14 20 r suv
## # ℹ 107 more rows
ggplot(cars2008,aes(x=cty))+
geom_histogram()+
labs(title = "defult histogram")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

6.3.2.2 彩色直方图
ggplot(cars2008,aes(x=hwy))+
geom_histogram(bins=20,color="white",fill="green")+
labs(title = "colored histogram1")

ggplot(cars2008,aes(x=hwy))+
geom_histogram(bins=40,color="white",fill="green")+
labs(title = "colored histogram2")

这里的bins这么理解:
直方图通过将数据分成多个区间(也称为箱子)来显示数据的分布情况。bins参数就是用来控制直方图中箱子的数量。具体来说,bins表示将整个数据范围(取值范围)划分为多少个等宽的区间。
假设你有一组数值数据,例如 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]。如果你将 bins 设置为 5,那么直方图将把数据范围(1-10)分成个等宽的区间,每个区间一个箱子。在这个例子中,每个箱子的宽度将是 (10-1)/5 = 1.8。
直方图的每个箱子将统计数据中落在该区间内(横着看,纵坐标体现的是频率)的观测值的数量,并绘制相应的条形。箱子的高度表示该区间内观测值的频数(或频率)。
6.3.2.3 纵坐标为百分比直方图
可以利用之前学到的scale() 函数结合y=..density..
library(scales)
ggplot(cars2008,aes(x=hwy,y=..density..))+
geom_histogram(bins=20,color="white",fill="green")+
scale_y_continuous(labels = scales::percent)+
labs(title = "Histogram with percent",
x="city miles per gallon",
y="Percent")
## Warning: The dot-dot notation (`..density..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(density)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

6.3.2.4纵坐标为百分比直方图同时添加核密度线反应变化趋势
使用geom_density()函数
library(scales)
ggplot(cars2008,aes(x=hwy,y=..density..))+
geom_histogram(bins=20,color="white",fill="green")+
scale_y_continuous(labels = scales::percent)+
geom_density(color="black",size=0.5)

labs(title = "Histogram with density curve",
x="city miles per gallon",
y="Percent")
## $x
## [1] "city miles per gallon"
##
## $y
## [1] "Percent"
##
## $title
## [1] "Histogram with density curve"
##
## attr(,"class")
## [1] "labels"
6.4 核密度图(曲线)
---一种在某个结果变量上跨组比较观测的强大方法
语法:
ggplot(data,aes(x=连续性变量))+geom_density()
6.4.1 举例(2008年汽车的每加仑汽油行驶英里数)
基础版
library(ggplot2)
data(mpg)
cars2008 <- mpg[mpg$year==2008,]
ggplot(cars2008,aes(x=cty))+geom_density()

填充版
ggplot(cars2008,aes(x=cty))+geom_density(fill="red")

打印默认带宽
bw.nrd0(cars2008$cty)
## [1] 1.408399
带宽(bandwidth)是一个用于控制核密度估计平滑度的参数。带宽决定了核函数在估计过程中的影响范围,从而影响了密度曲线的形状和平滑程度。
带宽的选择对于核密度估计的结果非常重要。较小的带宽会导致对数据的细微波动敏感,曲线可能会出现过度适应的情况,导致过拟合。而较大的带宽会导致曲线平滑度增加,可能会隐藏真实的数据特征。
带宽可以通过 adjust 参数来调整。adjust的默认值是1,它根据数据点的密度和总样本量自动选择带宽。较小的 adjust 值将产生较小的带宽,而较大的 adjust 值将产生较大的带宽。
可以通过手动设置 adjust 参数的值来控制带宽的大小。较小的 adjust 值(例如 0.2 或0.5)会使曲线更加细致地适应数据的细节,而较大的 adjust 值(例如 2或3)会使曲线更加平滑。
调整带宽
ggplot(cars2008,aes(x=cty))+geom_density(fill="red",adjust=0.2)

ggplot(cars2008,aes(x=cty))+geom_density(fill="red",adjust=3)

6.4.2 核密度图之间的比较
比较2008年四缸车、六缸车和八缸车,cyl(气缸数)的每加仑汽油行驶英里数估计值:
library(ggplot2)
data(mpg,package="ggplot2")
cars2008 <- mpg[mpg$year==2008 & mpg$cyl !=5,]
cars2008$Cylinders <- factor(cars2008$cyl)
ggplot(cars2008,aes(x=cty,color=Cylinders,linetype=Cylinders))+
geom_density(size=1)

气缸数(cyl)保存为类别型因子(Cylinders)。对变量Cylinders的每个水平绘制核密度曲线,颜色和线条类型都映射到气缸数。
注:使用factor()函数使Cylinders变为一个因子变量,使它变为连续变量。因为它原来是一个分类变量,不能用于该作图。
6.5 箱图geom_boxplot()
通过连续绘制变量的5个统计量,即最小值、下四分位数、中位数、上四分位数和最大值,描述连续型变量的分布。能够显示出可能离群点(范围+-1.5*IQR以外的值,IQR表示四分位距)。
6.5.1 单组举例
library(ggplot2)
ggplot(mtcars,aes(x="",y=mpg))+
geom_boxplot()

6.5.2 多组举例(x为组别,y为观测值)
cars <- mpg[mpg$cyl !=5,]
cars$Cylinders <- factor(cars$cyl)#使它变成因子变量
cars$Year <- factor(cars$year)
ggplot(cars,aes(x=Cylinders,y=cty))+
geom_boxplot()

6.5.3 notch=TRUE和varwidth=TRUE
1)当notch=TRUE 时,在**geom_boxplot()**函数中创建的箱线图中,会在每个箱体的中央绘制一个切口。这个切口是基于中位数的置信区间计算的,可以用来比较两个或多个组之间中位数是否有显著差异。如果notches不重叠,就可以得出结论,这两组数据的中位数存在显著差异。
2)varwidth参数用于确定箱子的宽度是否应该与每个组中的观测值数量的平方根成比例(varwidth = TRUE),还是所有的箱子应该具有相同的宽度(varwidth = FALSE)。
当varwidth = TRUE时,箱子的宽度根据每个组的样本大小进行调整,较大的箱子表示较大的样本大小。这在比较不同样本大小的组之间变量分布时很有用。
也可以使用width=具体值来制定箱图的宽度
cars <- mpg[mpg$cyl !=5,]
cars$Cylinders <- factor(cars$cyl)
cars$Year <- factor(cars$year)
ggplot(cars,aes(x=Cylinders,y=cty))+
geom_boxplot(notch = TRUE,
varwidth = TRUE)

6.5.4 多个分组因子
除了4,6,8缸车的分组外,同时我们加入不同年份的分组,并手动设置颜色:
cars <- mpg[mpg$cyl !=5,]
cars$Cylinders <- factor(cars$cyl)
cars$Year <- factor(cars$year)
ggplot(cars,aes(x=Cylinders,y=cty,fill=Year))+
geom_boxplot(notch = TRUE,
varwidth = TRUE)+
scale_fill_manual(values = c("gold","green"))
## Notch went outside hinges
## ℹ Do you want `notch = FALSE`?

6.6 小提琴图geom_violin()
小提琴图是箱图和核密度图的结合:
cars <- mpg[mpg$cyl !=5,]
cars$Cylinders <- factor(cars$cyl)
cars$Year <- factor(cars$year)
ggplot(cars,aes(x=Cylinders,y=cty,))+
geom_boxplot(width=0.2,fill="green")+
geom_violin(fill="gold",alpha=0.3)

width=0.2是为了箱图能放进去,小提琴图中的alpha=0.3是使其透明使得能看到箱图。
中间线为中位数。
6.7 点图geom_point()
6.7.1 用ggplot中的geom_point()
语法:
ggplot(data,aes=(x=连续性变量,y=分类变量))+geom_point()
举例:
library(ggplot2)
library(dplyr)
plot <- mpg %>%
filter(year=="2008") %>%
group_by(model) %>%
summarise(meanhwy=mean(hwy))
plot
## # A tibble: 38 × 2
## model meanhwy
## <chr> <dbl>
## 1 4runner 4wd 18.5
## 2 a4 29.3
## 3 a4 quattro 26.2
## 4 a6 quattro 24
## 5 altima 29
## 6 c1500 suburban 2wd 18
## 7 camry 30
## 8 camry solara 29.7
## 9 caravan 2wd 22.2
## 10 civic 33.8
## # ℹ 28 more rows
ggplot(plot,aes(x=meanhwy,y=model))+
geom_point()

根据数值大小排序(正序):
ggplot(plot,aes(x=meanhwy,y=reorder(model,meanhwy)))+
geom_point()

根据数值大小排序(倒序):
ggplot(plot,aes(x=meanhwy,y=reorder(model,-meanhwy)))+
geom_point()

6.8 补充dplyr的用法
dplyr全称为"data plyer",里面包含可以处理数据的函数,例如:
1.对数据进行汇总统计
summary_data <- summarize(data, summary_variable = summary_function(variable))
2.对数据进行分组
grouped_data <- group_by(data, variable)
3.创建新的变量
mutated_data <- mutate(data, new_variable =expression)
4.按照指定的变量排序
arranged_data <- arrange(data, variable)
5.筛选出满足条件的观测行
filtered_data <- filter(data, condition)
6.选择特定的列
selected_data <- select(data, column1, column2)
7.去除重复的观测
distinct_data <- distinct(data)
8.连接多个数据框
joined_data <- join(data1, data2, by = "key_variable")
6.9 补充:直方图和条形图的区别
1.数据类型:直方图用于连续变量的数据分布,而条形图用于离散或分类变量的数据比较。
2.横纵轴:直方图的横轴表示数据的取值范围,纵轴表示频数或频率。而条形图的横轴表示不同的类别或组,纵轴表示各类别的计数、频率或其他度量。
3.连续性:直方图中的每个条形是连续的,相邻的条形之间没有间隔。而条形图中的每个条形是离散的,它们之间可以有间隔。
4.用途:直方图常用于探索和展示数据的分布特征,例如观察数据的中心趋势、离散程度和偏斜程度。条形图常用于比较不同类别或组之间的数据,例如不同产品销售额的比较、不同地区的人口统计数据比较等。
总体而言,直方图更适合表示连续变量的分布情况,而条形图更适合比较离散变量或分类变量之间的差异。选择使用哪种图表类型取决于你要传达的信息和你的数据类型。
完整教程请查看