<- data2_1 |> gather(R语言,Python语言,key=课程,value=分数)
df
# 设置图形主题(可根据需要设置,省略时函数会根据默认设置绘图)
<-theme(plot.title=element_text(size="12"), # 设置主标题字体大小
mythemeaxis.title=element_text(size=10), # 设置坐标轴标签字体大小
axis.text=element_text(size=9), # 设置坐标轴刻度字体大小
legend.position="none") # 移除图例
# 绘制图形
<-ggplot(data=df,aes(x=性别,fill=性别))+ # 设置x轴,按性别填充颜色
p1geom_bar()+ # 绘制条形图
ylab("人数")+ # 设置y轴标签
+ # 使用设置的主题
mythemeggtitle("(a) 条形图") # 添加标题
<-ggplot(data=df,aes(x=课程,y=分数,fill=性别))+
p2geom_boxplot()+ # 绘制箱线图
facet_wrap(~性别)+ # 按性别分面
+ggtitle("(b) 分面箱线图")
mytheme
<-ggplot(data=df,aes(x=分数,fill=课程,alpha=0.2))+ # 设置颜色透明度alpha的值
p3geom_density()+ # 绘制核密度图
xlim(50,105)+ # 设置x轴值域(数值范围)
ylim(0,0.1)+ # 设置y轴值域(数值范围)
annotate("text",x=68,y=0.015,label="Python语言",size=4)+# 添加注释文本
annotate("text",x=85,y=0.015,label="R语言",size=4)+
+ggtitle("(c) 分组核密度图")
mytheme
<-ggplot(data=data2_1,aes(x=R语言,y=Python语言,fill=性别))+
p4geom_point(size=3,shape=21,color="black")+ # 绘制散点图
facet_wrap(~性别)+ # 按性别分面
+ggtitle("(d) 分面散点图")
mytheme
grid.arrange(p1,p2,p3,p4,ncol=2) # 按2列组合图形p1、p2、p3、p4
ggplot2包简介
1 ggplot2绘图语法
1.1 案例绘图
ggplot
函数指定要绘图的数据(通常是数据框),并生成一个空的图形对象(不生成图形)aes(x,y,…)
函数用于指定图形属性的映射,其中的x
用于指定坐标轴x
的变量或数值,y
用于指定坐标轴y
的变量或数值geom
是几何的缩写,表示要绘制的几何对象,在下划线“_”后面指定要绘制的几何图形ggplot2
的绘图语法是将各个部分用“+”连接起来使用
theme
函数设置图形主题,用于控制或修改图形外观
1.2 思考与代码修改
aes()
函数的fill参数有什么用?将数据中的某个变量映射到图形元素的填充颜色(如柱状图的柱子、箱线图的箱体、面积图的区域等)aes()
函数既可以嵌套在ggplot()
中作全局设定,也可以提取出外通过’+’连接作局部设定。修改p1的代码中
aes()
提取出ggplot()
函数外通过’+’,看能不能运行。不能运行geom_bar/geom_boxplot/geom_density/geom_point
分别代表绘制什么图形?分别代表绘制条形图/箱线图/概率密度曲线图/散点图
facet_wrap()
函数有什么用?在图p2代码中如果注释到这行会有什么后果。1、拆分数据:
根据一个或多个离散型变量(因子或字符型)将数据分成若干子集,每个子集绘制独立的图形。2、统一比较:
所有子图共享相同的坐标轴、比例尺和图形类型,便于横向对比。3、节省空间:
自动排列子图(如网格布局),避免手动创建多个单独图形。若将该代码注释掉,所有数据会合并到单一图形中绘制,不再按分类变量分组显示,无法比较组间差异。
aes(x=分数,fill=课程,alpha=0.2)
中fill
参数代表填充颜色,试将图p3中的fill
参数改为color
看有什么效果?图形仅是线条的颜色,曲线面积没有填充颜色。geom_point(size=3,shape=21,color="black")
中shape
参数代表点的形状,试将图p4中shape
参数取值改为25看有什么效果?点的形状变成了三角形代码
grid.arrange(p1,p2,p3,p4,ncol=2)
有什么用?相当于graphic包的什么代码?该代码将p1,p2,p3,p4,绘制的图形展示在两行两列的画布上,相当于graphic包的par(mfrow = c(2, 2))
该代码可以改写为par(mfrow = c(2, 2)) plot(p1) plot(p2) plot(p3) plot(p4)
# 修改原绘图代码以满足要求
<- data2_1 |> gather(R语言,Python语言,key=课程,value=分数)
df
# 设置图形主题(可根据需要设置,省略时函数会根据默认设置绘图)
<-theme(plot.title=element_text(size="12"), # 设置主标题字体大小
mythemeaxis.title=element_text(size=10), # 设置坐标轴标签字体大小
axis.text=element_text(size=9), # 设置坐标轴刻度字体大小
legend.position="none") # 移除图例
# 绘制图形
<-ggplot(data=df,aes(x=性别,fill=性别))+ # 设置x轴,按性别填充颜色
p1geom_bar()+ # 绘制条形图
ylab("人数")+ # 设置y轴标签
+ # 使用设置的主题
mythemeggtitle("(a) 条形图") # 添加标题
<-ggplot(data=df,aes(x=课程,y=分数,fill=性别))+
p2geom_boxplot()+ # 绘制箱线图
#facet_wrap(~性别)+ # 按性别分面
+ggtitle("(b) 分面箱线图")
mytheme<-ggplot(data=df,aes(x=分数,color=课程,alpha=0.2))+ # 设置颜色透明度alpha的值
p3geom_density()+ # 绘制核密度图
xlim(50,105)+ # 设置x轴值域(数值范围)
ylim(0,0.1)+ # 设置y轴值域(数值范围)
annotate("text",x=68,y=0.015,label="Python语言",size=4)+# 添加注释文本
annotate("text",x=85,y=0.015,label="R语言",size=4)+
+ggtitle("(c) 分组核密度图")
mytheme
<-ggplot(data=data2_1,aes(x=R语言,y=Python语言,fill=性别))+
p4geom_point(size=3,shape=25,color="black")+ # 绘制散点图
facet_wrap(~性别)+ # 按性别分面
+ggtitle("(d) 分面散点图")
mytheme
grid.arrange(p1,p2,p3,p4,ncol=2) # 按2列组合图形p1、p2、p3、p4
2 图形外观——设置坐标轴
2.1 案例绘图
图(a)是默认绘制的类别轴(本图为
x
轴)顺序是R语言、Python语言,使用scale_x_discrete(limits=c())
可根据需改变类别顺序图(b)是设置
coord_flip()
使坐标轴互换,同时,将x
轴(类别轴)标签旋转90度图(c)使用
theme(axis.title.x=element_blank())
移除y轴标签,要移除x
轴标签使用类似的设置;设置theme(axis.ticks.y=element_blank())
移除y
轴的刻度线图(d)使用
theme(axis.ticks=element_blank())
移除所有的刻度线,将坐标轴标签旋转是为了改变标签的角度。当标签较多时,也可以设置
scale_x_discrete(guide=guide_axis(n.dodge=2))
使x
轴标签排成为2行。使用xlim()
可以数值x
轴的数值范围。设置x轴数值范围时,函数会在该范围内设置坐标轴刻度,重新设置刻度线可以使用scale_x_continuous(limits=c(),breaks=c())
# 设置图形主题(可根据需要设置)
<-theme(plot.title=element_text(size="11"), # 设置主标题字体大小
mythemeaxis.title=element_text(size=10), # 设置坐标轴标签字体大小
axis.text=element_text(size=9), # 设置坐标轴刻度字体大小
legend.position="none") # 移除图例
# 图(a)修改类别轴项目顺序
<-ggplot(data=df,aes(x=课程,y=分数,fill=课程))+
p1geom_boxplot()+ # 绘制箱线图
scale_x_discrete(limits=c("Python语言","R语言"))+ # 修改类别轴项目顺序
+ggtitle("(a) 修改类别轴项目顺序\n默认顺序R语言、Python语言")
mytheme
# 图(b)坐标轴互换,并反转x轴元素的顺序
<-ggplot(data=df,aes(x=课程,y=分数,fill=课程))+
p2geom_boxplot()+
coord_flip()+ # 坐标轴互换(或者设置y=分数,x=课程)
ylim(54,101)+ # 设置y轴值域(数值范围)
theme(axis.text.y=element_text(size=9,angle=90,hjust=0.5,vjust=0.5))+ # 设置y轴标角度,并进行水平和垂直位置调整
scale_x_discrete(limits=rev(levels(df$课程)))+# 反转类别轴项目顺序
+ggtitle("(b) 坐标轴互换\n反转x轴元素的顺序并旋转90度")
mytheme
# 图(c)移除y轴刻度线和标签,删除x轴和y轴次网格线
<-ggplot(data=df,aes(x=分数,fill=课程,alpha=0.2))+
p3geom_density()+ # 绘制核密度图
xlim(50,105)+ # 设置x轴值域(数值范围)
ylim(0,0.1)+ # 设置y轴值域(数值范围)
theme(axis.title.y=element_blank(), # 移除y轴标签
axis.ticks.y=element_blank(), # 移除y轴刻度线
panel.grid.minor.x=element_blank(), # 去掉x轴次网格线
panel.grid.minor.y=element_blank())+ # 去掉y轴次网格线
annotate("text",x=69,y=0.015,label="Python语言",size=3)+# 添加注释文本
annotate("text",x=85,y=0.015,label="R语言",size=3)+
+ggtitle("(c) 移除y轴刻度线和y轴标签\n去掉x轴和y轴次网格线")
mytheme
# 图(d)移除所有刻度线,刻度标签旋转90度
<-ggplot(data=df,aes(x=分数,fill=课程,alpha=0.2))+
p4geom_density()+ # 绘制核密度图
scale_x_continuous(limits=c(50,100),
breaks=c(50,55,60,65,70,75,80,85,90,95,100))+ # 设置x轴值域和刻度线位置
scale_y_continuous(limits=c(0,0.1),
breaks=c(0,0.01,0.02,0.03,0.04,0.05,0.06,0.07))+ # 设置y轴值域和刻度线位置
ylab("密度")+ # 设置y轴标签
theme(axis.ticks=element_blank(), # 移除所有刻度线
axis.line=element_line(color="blue",linewidth=1.5), # 添加坐标轴直线
axis.text.x=element_text(size=9,angle=90,hjust=1,vjust=1))+ # 设置x轴标签角度
annotate("text",x=69,y=0.015,label="Python语言",size=3)+ # 添加注释文本
annotate("text",x=85,y=0.015,label="R语言",size=3)+
+ggtitle("(d) 移除所有刻度线\nx轴刻度标签旋转90度")
mytheme
grid.arrange(p1,p2,p3,p4,ncol=2) # 组合图形
2.2 思考与代码修改
ggplot2
包通过theme()
函数设置主题要素参数,如何实现全局设定和局部设定?全局设定通过
theme_set()
函数设置全局主题,之后所有ggplot2
图形都会自动继承该主题局部设定在单个 ggplot() 调用中直接使用 theme() 函数,覆盖全局主题的某些参数。
scale_x_discrete()
函数有什么作用?如何将p1的横轴标题由“课程”改为“科目”。是 ggplot2 中用于调整 离散型(分类)变量 x 轴 的函数,主要功能包括:
1、修改轴标题:调整横轴的显示名称(如将“课程”改为“科目”)。
2、控制轴标签:自定义分类标签的显示内容或顺序(如
labels
参数)。3、限制显示范围:通过
limits
参数筛选或重新排序分类变量。4、调整美学映射:如颜色、大小等(需配合其他参数使用)。
将p1的横轴标题由“课程”改为“科目”:scale_x_discrete(name = “科目”,limits=c(“Python语言”,“R语言”))
将图p2注释掉
theme(axis.text.y=element_text(size=9,angle=90,hjust=0.5,vjust=0.5))
有什么影响?纵坐标的元素呈水平放置,没有旋转90度annotate()
函数除了能在图中添加文本注释还能添加什么?将p3中“R语言”的文本注释放在蓝色区域的右边。annotate()
函数在 ggplot2 中不仅可以添加文本注释,还支持多种几何对象(如线段、矩形、箭头、点等),用于在图形中插入非数据相关的标记或装饰元素。将p4的x轴刻度标签角度改为45度
# 修改原绘图代码以满足要求
# 设置图形主题(可根据需要设置)
<-theme(plot.title=element_text(size="11"), # 设置主标题字体大小
mythemeaxis.title=element_text(size=10), # 设置坐标轴标签字体大小
axis.text=element_text(size=9), # 设置坐标轴刻度字体大小
legend.position="none") # 移除图例
# 图(a)修改类别轴项目顺序
<-ggplot(data=df,aes(x=课程,y=分数,fill=课程))+
p1geom_boxplot()+ # 绘制箱线图
scale_x_discrete(name = "科目",limits=c("Python语言","R语言"))+ # 修改类别轴项目顺序
+ggtitle("(a) 修改类别轴项目顺序\n默认顺序R语言、Python语言")
mytheme
# 图(b)坐标轴互换,并反转x轴元素的顺序
<-ggplot(data=df,aes(x=课程,y=分数,fill=课程))+
p2geom_boxplot()+
coord_flip()+ # 坐标轴互换(或者设置y=分数,x=课程)
ylim(54,101)+ # 设置y轴值域(数值范围)
#theme(axis.text.y=element_text(size=9,angle=90,hjust=0.5,vjust=0.5))+ # 设置y轴标角度,并进行水平和垂直位置调整
scale_x_discrete(limits=rev(levels(df$课程)))+# 反转类别轴项目顺序
+ggtitle("(b) 坐标轴互换\n反转x轴元素的顺序并旋转90度")
mytheme
# 图(c)移除y轴刻度线和标签,删除x轴和y轴次网格线
<-ggplot(data=df,aes(x=分数,fill=课程,alpha=0.2))+
p3geom_density()+ # 绘制核密度图
xlim(50,105)+ # 设置x轴值域(数值范围)
ylim(0,0.1)+ # 设置y轴值域(数值范围)
theme(axis.title.y=element_blank(), # 移除y轴标签
axis.ticks.y=element_blank(), # 移除y轴刻度线
panel.grid.minor.x=element_blank(), # 去掉x轴次网格线
panel.grid.minor.y=element_blank())+ # 去掉y轴次网格线
annotate("text",x=69,y=0.015,label="Python语言",size=3)+# 添加注释文本
annotate("text",x=100,y=0.015,label="R语言",size=3)+
+ggtitle("(c) 移除y轴刻度线和y轴标签\n去掉x轴和y轴次网格线")
mytheme
# 图(d)移除所有刻度线,刻度标签旋转90度
<-ggplot(data=df,aes(x=分数,fill=课程,alpha=0.2))+
p4geom_density()+ # 绘制核密度图
scale_x_continuous(limits=c(50,100),
breaks=c(50,55,60,65,70,75,80,85,90,95,100))+ # 设置x轴值域和刻度线位置
scale_y_continuous(limits=c(0,0.1),
breaks=c(0,0.01,0.02,0.03,0.04,0.05,0.06,0.07))+ # 设置y轴值域和刻度线位置
ylab("密度")+ # 设置y轴标签
theme(axis.ticks=element_blank(), # 移除所有刻度线
axis.line=element_line(color="blue",linewidth=1.5), # 添加坐标轴直线
axis.text.x=element_text(size=9,angle=45,hjust=1,vjust=1))+ # 设置x轴标签角度
annotate("text",x=69,y=0.015,label="Python语言",size=3)+ # 添加注释文本
annotate("text",x=85,y=0.015,label="R语言",size=3)+
+ggtitle("(d) 移除所有刻度线\nx轴刻度标签旋转90度")
mytheme
grid.arrange(p1,p2,p3,p4,ncol=2) # 组合图形
3 图形外观——设置图形标题
3.1 案例绘图
# 初始图形,所有设置均为默认
<-ggplot(data=df)+aes(x=课程,y=分数,fill=性别)+
pgeom_boxplot() # 绘制箱线图
# 设置标题
<-p+ggtitle("(a) 这里是标题(默认设置)") # 添加标题
p1
<-p+ggtitle("(b) 这里是标题(设置字体大小,粗体字)")+
p2theme(plot.title=element_text(size=10,face="bold"))# 设置标题字体大小
<-p+labs(title=("(c) 这里是标题(标题位置居中)\n(标题换行)"))+ # 标题换行(在\n处断行)
p3theme(plot.title=element_text(size=12,hjust=0.5)) # 调整标题位置(居中)
<-p+ggtitle("(d) 这里是主标题(蓝色粗斜体)","(这里是副标题)")+ # 添加副标题
p4theme(plot.title=element_text(size=12,face="bold.italic",color="blue3")) # 设置标题为粗斜体字,蓝色
::grid.arrange(p1,p2,p3,p4,ncol=2) # 组合图形 gridExtra
3.2 思考
ggtitle()
中第一个参数为主标题,第二个参数为副标题;再通过主题函数theme(plot.title=element_text())
设置标题的具体属性element_text()
为文本属性设定函数,一共有多少个参数可以设定?一共有20个参数可以设定element_text(size=10,face="bold")
代表什么意思?是一个常用的文本样式设定函数,用于自定义图形中的文本元素(如标题、坐标轴标签、图例文字等)。
size = 10
设置文本大小为 10 磅(pt),适用于控制字体物理尺寸。
示例:调整坐标轴标签字体大小。
face = "bold"
置文本样式为 粗体,其他可选值包括:
"plain"
(常规,默认)"italic"
(斜体)"bold.italic"
(粗斜体)示例:强调图形标题。
ement_text(size=12,hjust=0.5)
代表什么意思?是 ggplot2 中用于自定义文本样式的函数参数组合,具体含义如下:
1、size = 12
设置文本的字体大小为 12 磅(pt),属于中等偏大的字号,适合标题或重点标注。
2、hjust = 0.5
控制文本的 水平对齐方式,
0.5
表示 居中对齐。hjust = 0
:左对齐hjust = 1
:右对齐hjust = 0.5
:居中(默认值,通常用于标题或对称布局)element_text(size=12,face="bold.italic",color="blue3")
代表什么意思?ggplot2 中用于深度自定义文本样式的函数参数组合,具体含义如下:
1、size = 12
设置文本字号为 12磅(pt),属于中等偏大的字体尺寸,适合标题或重点标注。
face = "bold.italic"
定义字体样式为 加粗且斜体,其他可选值:
"plain"
(常规)"bold"
(仅加粗)"italic"
(仅斜体)效果:文本同时具备粗体的强调性和斜体的动态感。
2、color = "blue3"
指定文本颜色为 R内置的深蓝色(
"blue3"
对应十六进制值#0000CD
)。支持颜色名称(如
"red"
)
4 图形外观——设置图例
4.1 案例绘图
# 初始图形,所有设置均为默认
<-ggplot(data=df)+aes(x=课程,y=分数,fill=性别)+
pgeom_boxplot() # 绘制箱线图
# 设置图例
<-p+ggtitle("(a) 默认图例")
p1<-p+ggtitle("(b) 移除图例")+
p2theme(legend.position="none") # 移除图例(或设置guides(fill="none"))
<-p+ggtitle("(c) 设置图例位置、字体、背景和边框颜色")+
p3theme(legend.text=element_text(size=8,color="blue"), # 设置图例字体大小和颜色
legend.position="top", # 设置图例位置(顶部)
legend.background=element_rect(fill="grey85",color="grey"),
# 设置图例背景色和边框颜色
legend.key=element_rect(color="blue",linewidth=0.25))
# 设置图例键的颜色和线宽
<-p+ggtitle("(d) 设置图例位置、摆放方式和顺序")+
p4theme(legend.position=c(0.75,0.9), # 设置图例位置
legend.background=element_blank(), # 移除图例整体边框
legend.text=element_text(size=8))+ # 设置图例字体大小
guides(fill=guide_legend(nrow=1,title=NULL))+
# 设置图例摆放方式(1行,去掉图例标题)
scale_fill_discrete(limits=c("女","男")) # 修改图例顺序
Warning: A numeric `legend.position` argument in `theme()` was deprecated in ggplot2
3.5.0.
ℹ Please use the `legend.position.inside` argument of `theme()` instead.
::grid.arrange(p1,p2,p3,p4,ncol=2) # 组合图形 gridExtra
4.2 思考与代码修改
theme()
函数中legend.text/legend.position/legend.background/legend.key
四个参数分别设定什么方面的内容?1、legend.text
作用:控制图例中文字(标签)的样式。
可调整属性:字体大小、颜色、字体族、角度等。
2、legend.position
作用:设置图例的显示位置。
常用值:
"right"
(默认)、"left"
、"top"
、"bottom"
:指定图例位于图形的某一侧。"none"
:隐藏图例。c(x, y)
:通过坐标(0-1相对位置)精确放置图例(如c(0.8, 0.2)
)。3、legend.background
作用:设置图例的背景样式(矩形区域)。
可调整属性:填充色、边框颜色、边框线型等。
4、legend.key
作用:控制图例中每个标签对应的标识(key,即颜色/形状的示例框)的样式。
可调整属性:填充色、边框颜色、大小、形状等。
element_rect()
矩形对象属性设定函数,legend.background/legend.key
两个参数为什么需要用它设定?element_rect()
是专门用于定义矩形对象样式的函数,而legend.background
和legend.key
这两个参数之所以需要通过element_rect()
来设定,是因为它们控制的图例组成部分(图例整体背景和图例标识框)本质上都是矩形区域。1、legend.background
图例背景是一个矩形框,需要通过element_rect()
定义其填充色(fill
)、边框颜色(color
)、边框线型(linetype
)等属性。2、legend.key
这些标识框本质上是小矩形,需要通过element_rect()
控制其填充色、边框、大小等。修改图p3的代码,将图例位置改为图形下方,将图例标题
legend.title
”性别“的字体颜色也改为蓝色。修改图p4的代码,将图例位置改为图中的右下方,图例中男左女右。
# 修改原绘图代码以满足要求
<-ggplot(data=df)+aes(x=课程,y=分数,fill=性别)+
pgeom_boxplot() # 绘制箱线图
# 设置图例
<-p+ggtitle("(a) 默认图例")
p1<-p+ggtitle("(b) 移除图例")+
p2theme(legend.position="none") # 移除图例(或设置guides(fill="none"))
<-p+ggtitle("(c) 设置图例位置、字体、背景和边框颜色")+
p3theme(legend.text=element_text(size=8,color="blue"), # 设置图例字体大小和颜色
legend.title = element_text(color = "blue"),# 图例标题("性别")颜色
legend.position="top", # 设置图例位置(顶部)
legend.background=element_rect(fill="grey85",color="grey"),
# 设置图例背景色和边框颜色
legend.key=element_rect(color="blue",linewidth=0.25))
# 设置图例键的颜色和线宽
<-p+ggtitle("(d) 设置图例位置、摆放方式和顺序")+
p4theme(legend.position=c(0.9,0.1), # 设置图例位置
legend.background=element_blank(), # 移除图例整体边框
legend.text=element_text(size=8))+ # 设置图例字体大小
guides(fill=guide_legend(nrow=1,title=NULL))+
# 设置图例摆放方式(1行,去掉图例标题)
scale_fill_discrete(limits=c("女","男")) # 修改图例顺序
::grid.arrange(p1,p2,p3,p4,ncol=2) # 组合图形 gridExtra
5 图形外观——长标签处理
5.1 案例绘图
<-data.frame(
df=c("流行病和卫生统计","数据科学与大数据技术","数理统计"),
专业=c("Python机器学习原理与实践","数据建模","数据科学统计基础"),
课程=c(76,88,82))
平均分数
# 绘制条形图
<-ggplot(df)+aes(x=课程,y=平均分数,fill=专业)+
pgeom_col(width=0.8,color="grey50")
# 图(a)默认绘制
<-p+theme(panel.background=element_rect(fill="lightyellow"),# 设置图形面板背景色
p1plot.background=element_rect(fill="lightblue"))+# 设置图形整体背景色
ggtitle("(a) 默认绘制")
# 图(b)在适当位置折行
<-p+scale_x_discrete(labels=c("Python\n机器学习\n原理与实践","数据建模","数据科学\n统计基础"))+ # 将x轴的长标签折行
p2theme(axis.text=element_text(lineheight=1))+ # 设置x轴标签文本的高度
scale_fill_discrete(labels=c("流行病和\n卫生统计","数据科学\n与大数据\n技术","数理统计"))+ # 将图例标签折行
theme(legend.text=element_text(lineheight=1),
legend.key.height=unit(1,"cm"))+ # 设置图例文本和色键高度
ggtitle("(b) 在适当位置折行")
# 图(c)设置标签文本宽度
<-p+scale_x_discrete(labels=function(x) str_wrap(x,width=8))+ # 设置x轴标签宽度
p3theme(axis.text=element_text(lineheight=1))+ # 设置x轴标签文本的高度
scale_fill_discrete(labels=function(x) str_wrap(x,width=8))+ # 设置图例标签宽度
theme(legend.text=element_text(lineheight=1),
legend.key.height=unit(1,"cm"))+
ggtitle("(c) 设置标签文本宽度")
grid.arrange(p1,p2,p3,layout_matrix=rbind(c(1,1),c(2,3)))
5.2 思考
R语言的”
\
“为转义符,"Python\n机器学习\n原理与实践"
中的\n
表示什么意思?在 R语言 中,
\n
是一个转义字符,表示换行符(Newline)。当字符串中包含\n
时,R 会将其解析为换行,使得后续文本从新的一行开始显示。grid.arrange()
函数中参数设定layout_matrix=rbind(c(1,1),c(2,3))
表示什么意思?在
grid.arrange()
函数(来自gridExtra
包)中,layout_matrix
参数用于自定义多图形的排列布局。通过rbind(c(1,1), c(2,3))
这样的矩阵,可以精确控制每个子图的位置和占位比例。
6 图形外观——使用已有图形主题
6.1 案例代码
<- data2_1 |> gather(R语言,Python语言,key=课程,value=分数)
df
<-ggplot(data=df)+aes(x=课程,y=分数,fill=性别)+
pgeom_boxplot() # 绘制箱线图
<-p+theme_grey()+ggtitle("(a)+theme_grey") # 默认主题
p1<-p+theme_bw()+ggtitle("(b) theme_bw") # 黑白主题
p2<-p+theme_minimal()+ggtitle("(c) theme_minimal") # 最小主题
p3<-p+theme_classic()+ggtitle("(d) theme_classic") # 经典主题
p4
::grid.arrange(p1,p2,p3,p4,ncol=2) # 组合图形 gridExtra
除了ggplot2包自带的主题函数外,还有很多包提供主题函数。
library(ggthemes)
<-p+theme_economist_white()+ggtitle("(a) theme_economist_white") # 《经济学人》杂志白色主题
p1<-p+theme_excel()+ggtitle("(b) theme_excel") # Excel主题
p2<-p+theme_few()+ggtitle("(c) theme_few") # 少数人使用的图形主题
p3<-p+theme_stata()+ggtitle("(d) theme_stata") # 基于Stata图形方案的主题
p4
::grid.arrange(p1,p2,p3,p4,ncol=2) # 组合图形 gridExtra
6.2 思考与代码修改
试在Deepseek中提问”R语言中针对ggpolt函数绘图,有哪些主题包和主题函数?“
1、ggplot2
自带了一些基础主题函数,可以直接通过theme_*()
调用:theme_gray()
默认主题(灰色背景,白色网格线) ggplot(...) + theme_gray()
theme_bw()
黑白主题(白色背景,黑色边框) ggplot(...) + theme_bw()
theme_minimal()
极简风格(无背景、无边框) ggplot(...) + theme_minimal()
theme_classic()
经典风格(无网格线,简洁坐标轴) ggplot(...) + theme_classic()
theme_void()
完全空白(只保留图形,无坐标轴) ggplot(...) + theme_void()
theme_dark()
暗黑风格(深色背景) ggplot(...) + theme_dark()
2、除了 ggplot2 自带的主题,还有一些扩展包提供更多风格:
提供多种出版级主题(如经济学人、华尔街日报等) | theme_economist() , theme_wsj() |
|
cowplot |
优化科研绘图,适合论文发表 | theme_cowplot() , theme_half_open() |
hrbrthemes |
现代风格,适合数据可视化 | theme_ipsum() , theme_ft_rc() |
ggsci |
提供科学期刊配色(如 Nature、Science 风格) | theme_sci() , scale_color_npg() |
ggpubr |
适合医学和生物统计绘图 | theme_pubr() , theme_pubclean() |
ggthemes/hrbrthemes/ggpubr
等包提供多种商业化绘图主题。选择四种你喜欢的主题设置,应用于案例绘图中。
library(ggthemes)
library(hrbrthemes)
#library(ggpubr)
#
<- ggplot(mtcars, aes(x = mpg, y = wt, color = factor(cyl))) +
p geom_point(size = 3) +
labs(title = "汽车油耗与车重的关系", x = "每加仑英里数 (mpg)", y = "车重 (wt)", color = "气缸数")
library(ggpubr)
+
p theme_pubr() + # 简洁科研主题
scale_color_manual(values = c("#E69F00", "#56B4E9", "#009E73")) # 自定义颜色
7 添加注释
7.1 案例绘图
<- data2_1
d <-ggplot(data=d)+aes(x=R语言,y=Python语言)+
pgeom_point(size=3,shape=21,color="black",fill="red2")+ # 绘制点
scale_x_continuous(breaks=c(70,75,80,85,90,95))+ # 设置x轴值域和刻度线位置
geom_smooth(method = lm) # 添加线性回归线和置信带
# 添加注释
+geom_vline(xintercept=mean(d$R语言),linetype="twodash",color="grey50",size=0.5)+ # 添加x的均值线(垂直线)
pgeom_hline(yintercept=mean(d$Python语言),linetype="twodash",color="grey50",size=0.5)+ # 添加y的均值线(水平线)
geom_point(x=mean(d$R语言),y=mean(d$Python语言),shape=21,size=5,fill="yellow")+# 添加均值点
annotate("text",x=72,y=81,label="相关系数: r = ",size=5,color="red3")+ # 添加注释文本
annotate("text",x=77.2,y=81,label=round(cor(d$R语言,d$Python语言),4),size=5,color="red3")+ # 添加相关系数
geom_rect(xmin=87, xmax=97, ymin=56.5,ymax=63,fill=NA)+# 添加矩形
annotate("text",x=92,y=60,parse=TRUE,size=5,color="red3",label="r==frac(cor(xy),sqrt(var(x)*var(y)))")+ # 添加相关系数的数学表达式
annotate("text",x=84,y=81,label="回归线:",size=5,color="blue3")+ # 添加注释文本
annotate("text",x=88.8,y=81.3,parse=TRUE,size=4.5,color="blue3",label="hat(y)==hat(beta)[0]+hat(beta)[1]*x")+ # 添加回归方程数学表达式
annotate("segment",x=68.5,xend=79,y=79.8,yend=79.8,color="red4",size=0.5)+ # 添加直线
annotate("segment",x=88,xend=92,y=80,yend=78,color="blue",size=1,arrow=arrow(angle=15,length=unit(0.2,"inches"))) # 添加带箭头的线
Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
ℹ Please use `linewidth` instead.
`geom_smooth()` using formula = 'y ~ x'
7.2 思考
annotate()
函数中参数parse=TRUE
有什么用,尝试将其删除观测结果变化。parse = TRUE
的作用是将文本标签解析为数学表达式或符号(类似于 LaTeX 语法),从而支持数学公式、上下标、希腊字母等高级格式。如果删除parse = TRUE
,文本将按普通字符串显示,不再解析数学表达式。如何将相关性公式的背景框颜色去掉?
geom_rect(xmin=87, xmax=97, ymin=56.5,ymax=63,fill=NA)+# 添加矩形,将该代码的fill后的颜色改为NA。
8 图形分面
案例绘图
<- data2_1 |> gather(R语言,Python语言,key=课程,value=分数)
df
<-ggplot(data=df)+aes(x=课程,y=分数,fill=性别)+geom_boxplot()+
p1facet_wrap(~性别,ncol=2)+ # 按性别2列分面
ggtitle("(a) 按性别2列分面")
<-ggplot(data=df)+aes(x=课程,y=分数,fill=性别)+geom_boxplot()+
p2facet_grid(性别~.)+ # 按性别2行分面
ggtitle("(b) 按性别2行分面")
<-ggplot(data=df)+aes(x=课程,y=分数,fill=性别)+geom_boxplot()+
p3facet_wrap(~课程,ncol=3) + # 按专业3列分面
ggtitle("(c) 按专业3列分面")
<-ggplot(data=df)+aes(x=课程,y=分数,fill=性别)+geom_boxplot()+
p4facet_grid(课程~性别)+ # 按课程(行)和性别(列)分面
theme(panel.spacing.x=unit(0.2,"lines"), # 设置子图的x轴间距
panel.spacing.y=unit(0.1,"lines"), # 设置子图的y轴间距
strip.text=element_text(size=10), # 设置分面字体大小
strip.background=element_rect(fill="skyblue",color="blue4"))+
# 设置分面背景颜色和边框颜色
ggtitle("(d) 按课程(行)和性别(列)分面")
::grid.arrange(p1,p2,p3,p4,ncol=2) # 组合图形 gridExtra
8.1 思考
分面函数
facet_grid()
如何使用?基本语法:facet_grid(rows = vars(行变量), cols = vars(列变量), …)
rows
:垂直方向的分面变量(每个水平生成一行子图)cols
:水平方向的分面变量(每个水平生成一列子图)vars()
:用于指定分面变量(也可直接用~
公式语法)在主题函数
theme()
中,以什么开头的参数控制绘图分面要素的属性?在
ggplot2
的theme()
函数中,控制分面要素(facet)属性的参数均以strip.
开头,这些参数专门用于调整分面标签(facet label)和分面背景的样式。
9 图形组合
9.1 案例绘图
# 设置图形主题(可根据需要设置)
<-theme(plot.title=element_text(size="11"), # 设置主标题字体大小
mythemeaxis.title=element_text(size=10), # 设置坐标轴标签字体大小
axis.text=element_text(size=9), # 设置坐标轴刻度字体大小
legend.position="none")
<-ggplot(data=df)+aes(x=性别,fill=性别)+
p1geom_bar(width=0.8)+ylab("人数")+ # 绘制条形图
+ggtitle("(a) 条形图")
mytheme
<-ggplot(data=df)+aes(x=分数)+
p2geom_histogram(binwidth=5,fill="lightgreen",color="gray50")+# 绘制直方图
+ggtitle("(b) 直方图")
mytheme
<-ggplot(data=df)+aes(x=课程,y=分数,fill=课程)+
p3geom_boxplot()+ # 绘制箱线图
+ggtitle("(c) 箱线图")
mytheme
<-ggplot(data=df,aes(x=课程,y=分数,fill=课程))+
p4geom_violin()+ # 绘制小提琴图
+ggtitle("(d) 小提琴图")
mytheme
<-ggplot(data=df)+aes(x=分数,fill=课程,alpha=0.2)+
p5geom_density()+ # 绘制核密度图
xlim(50,105)+ylim(0,0.1)+
+ggtitle("(e) 核密度图") mytheme
9.2 页面布局1
# 按行填充子图,行高比为1:2
grid.arrange(p1,p2,p3,p5, # 组合图形p1、p2、p3、p5
heights=c(1,2), # 设置行高为1:2
layout_matrix=rbind(c(1,2,3),c(5,5,5))) # 2行3列的矩阵布局
9.3 页面布局2
# 按行填充子图,行高比为1:2:1
grid.arrange(p1,p2,p3,p4,p5, # 组合图形p1、p2、p3、p4、p5
heights=c(1,2,1), # 设置行高为1:2:1
layout_matrix=rbind(c(1,2,2),c(5,5,5),c(3,3,4))) # 3行3列矩阵布局
9.4 页面布局3
# 按列填充子图,列宽比为1:2
grid.arrange(p1,p2,p3,p4,p5, # 组合图形p1、p2、p3、p4、p5
widths=c(1,2), # 设置列宽为1:2
layout_matrix=cbind(c(1,4,3),c(2,5,5))) # 3行2列矩阵布局