## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.1 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.1
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
##
## 载入程辑包:'gridExtra'
##
##
## The following object is masked from 'package:dplyr':
##
## combine
ggplot函数指定要绘图的数据(通常是数据框),并生成一个空的图形对象(不生成图形)
aes(x,y,…)函数用于指定图形属性的映射,其中的x用于指定坐标轴x的变量或数值,y用于指定坐标轴y的变量或数值
geom是几何的缩写,表示要绘制的几何对象,在下划线“_”后面指定要绘制的几何图形
ggplot2的绘图语法是将各个部分用“+”连接起来
使用theme函数设置图形主题,用于控制或修改图形外观
df <- data2_1 |> gather(R语言,Python语言,key=课程,value=分数)
# 设置图形主题(可根据需要设置,省略时函数会根据默认设置绘图)
mytheme<-theme(plot.title=element_text(size="12"), # 设置主标题字体大小
axis.title=element_text(size=10), # 设置坐标轴标签字体大小
axis.text=element_text(size=9), # 设置坐标轴刻度字体大小
legend.position="none") # 移除图例
# 绘制图形
p1<-ggplot(data=df,aes(x=性别,fill=性别))+ # 设置x轴,按性别填充颜色
geom_bar()+ # 绘制条形图
ylab("人数")+ # 设置y轴标签
mytheme+ # 使用设置的主题
ggtitle("(a) 条形图") # 添加标题
p2<-ggplot(data=df,aes(x=课程,y=分数,fill=性别))+
geom_boxplot()+ # 绘制箱线图
facet_wrap(~性别)+ # 按性别分面
mytheme+ggtitle("(b) 分面箱线图")
p3<-ggplot(data=df,aes(x=分数,fill=课程,alpha=0.2))+ # 设置颜色透明度alpha的值
geom_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)+
mytheme+ggtitle("(c) 分组核密度图")
p4<-ggplot(data=data2_1,aes(x=R语言,y=Python语言,fill=性别))+
geom_point(size=3,shape=21,color="black")+ # 绘制散点图
facet_wrap(~性别)+ # 按性别分面
mytheme+ggtitle("(d) 分面散点图")
grid.arrange(p1,p2,p3,p4,ncol=2) # 按2列组合图形p1、p2、p3、p4
aes()函数的fill参数有什么用?aes()函数既可以嵌套在ggplot()
中作全局设定,也可以提取出外通过’+’连接作局部设定。
fill用于将变量映射到图形的填充颜色(即图形内部的颜色),通常适用于以下几何对象:
条形图(geom_bar、geom_col)
面积图(geom_area)
多边形(geom_polygon)
箱线图(geom_boxplot)
密度图(geom_density)
点图(geom_point,当点具有shape = 21-25时)
修改p1的代码中aes()
提取出ggplot()函数外通过’+’,看能不能运行
geom_bar/geom_boxplot/geom_density/geom_point分别代表绘制什么图形?
条形图,箱线图,密度图,散点图
facet_wrap()函数有什么用?在图p2代码中如果注释到这行会有什么后果。
用于分面绘图(Faceting),即根据某个分类变量将数据拆分成多个子图(面板),并按网格排列展示。
有——按性别分面,无——合在一起
aes(x=分数,fill=课程,alpha=0.2)
中fill参数代表填充颜色,试将图p3中的fill
参数改为color 看有什么效果?
color作用于边框/线条的颜色,只有边框有颜色
geom_point(size=3,shape=21,color="black")
中shape参数代表点的形状,试将图p4中shape参数取值改为25看有什么效果?
变成三角形
代码grid.arrange(p1,p2,p3,p4,ncol=2)有什么用?相当于graphic包的什么代码?
按2列组合图形p1、p2、p3、p4
相当于par(mfrow=c(2,2))或par(mfcol=c(2,2))
# 修改原绘图代码以满足要求
df <- data2_1 |> gather(R语言,Python语言,key=课程,value=分数)
# 设置图形主题(可根据需要设置,省略时函数会根据默认设置绘图)
mytheme<-theme(plot.title=element_text(size="12"), # 设置主标题字体大小
axis.title=element_text(size=10), # 设置坐标轴标签字体大小
axis.text=element_text(size=9), # 设置坐标轴刻度字体大小
legend.position="none") # 移除图例
# 绘制图形
p1<-ggplot(data=df)+(aes(x=性别,fill=性别))+ # 设置x轴,按性别填充颜色
geom_bar()+ # 绘制条形图
ylab("人数")+ # 设置y轴标签
mytheme+ # 使用设置的主题
ggtitle("(a) 条形图") # 添加标题
p2<-ggplot(data=df,aes(x=课程,y=分数,fill=性别))+
geom_boxplot()+ # 绘制箱线图
#facet_wrap(~性别)+ # 按性别分面
mytheme+ggtitle("(b) 分面箱线图")
p3<-ggplot(data=df,aes(x=分数,color=课程,alpha=0.2))+ # 设置颜色透明度alpha的值
geom_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)+
mytheme+ggtitle("(c) 分组核密度图")
p4<-ggplot(data=data2_1,aes(x=R语言,y=Python语言,fill=性别))+
geom_point(size=3,shape=25,color="black")+ # 绘制散点图
facet_wrap(~性别)+ # 按性别分面
mytheme+ggtitle("(d) 分面散点图")
grid.arrange(p1,p2,p3,p4,ncol=2) # 按2列组合图形p1、p2、p3、p4
图(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())
# 设置图形主题(可根据需要设置)
mytheme<-theme(plot.title=element_text(size="11"), # 设置主标题字体大小
axis.title=element_text(size=10), # 设置坐标轴标签字体大小
axis.text=element_text(size=9), # 设置坐标轴刻度字体大小
legend.position="none") # 移除图例
# 图(a)修改类别轴项目顺序
p1<-ggplot(data=df,aes(x=课程,y=分数,fill=课程))+
geom_boxplot()+ # 绘制箱线图
scale_x_discrete(limits=c("Python语言","R语言",name="科目"))+ # 修改类别轴项目顺序
mytheme+ggtitle("(a) 修改类别轴项目顺序\n默认顺序R语言、Python语言")
# 图(b)坐标轴互换,并反转x轴元素的顺序
p2<-ggplot(data=df,aes(x=课程,y=分数,fill=课程))+
geom_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$课程)))+# 反转类别轴项目顺序
mytheme+ggtitle("(b) 坐标轴互换\n反转x轴元素的顺序并旋转90度")
# 图(c)移除y轴刻度线和标签,删除x轴和y轴次网格线
p3<-ggplot(data=df,aes(x=分数,fill=课程,alpha=0.2))+
geom_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)+
mytheme+ggtitle("(c) 移除y轴刻度线和y轴标签\n去掉x轴和y轴次网格线")
# 图(d)移除所有刻度线,刻度标签旋转90度
p4<-ggplot(data=df,aes(x=分数,fill=课程,alpha=0.2))+
geom_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.07),
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)+
mytheme+ggtitle("(d) 移除所有刻度线\nx轴刻度标签旋转90度")
grid.arrange(p1,p2,p3,p4,ncol=2) # 组合图形
ggplot2 包通过theme()
函数设置主题要素参数,如何实现全局设定和局部设定?
theme_set(theme_bw() + mytheme) # 全局设置
scale_x_discrete()函数有什么作用?如何将p1的横轴标题由“课程”改为“科目”。
scale_x_discrete()函数用于处理X轴上离散变量的函数,可以对离散变量进行分类标记,使图表清晰将图p2注释掉theme(axis.text.y=element_text(size=9,angle=90,hjust=0.5,vjust=0.5))有什么影响?
文本从竖直变为水平显示
annotate()
函数除了能在图中添加文本注释还能添加什么?将p3中“R语言”的文本注释放在蓝色区域的右边。
文本注释:可以在图中指定位置添加自定义文本、数学公式、标签、标题等。
线段:使用annotate("segment", ...)可以在图中添加线段,通过指定起点和终点的坐标来确定线段的位置。
矩形:使用annotate("rect", ...)可以在图中添加矩形,可以通过指定矩形的四个顶点坐标来确定矩形的位置和大小。
箭头:使用annotate("segment", ...)并设置arrow参数,可以在图中添加带箭头的线段,用于指示方向或强调特定的数据点。
点:使用annotate("point", ...)可以在图中添加点,通过指定点的坐标来确定点的位置。
将p4的x轴刻度标签角度改为45度
# 修改原绘图代码以满足要求
# 设置图形主题(可根据需要设置)
mytheme<-theme(plot.title=element_text(size="11"), # 设置主标题字体大小
axis.title=element_text(size=10), # 设置坐标轴标签字体大小
axis.text=element_text(size=9), # 设置坐标轴刻度字体大小
legend.position="none") # 移除图例
theme_set(theme_bw() + mytheme) # 全局设置
# 图(a)修改类别轴项目顺序
p1<-ggplot(data=df,aes(x=课程,y=分数,fill=课程))+
geom_boxplot()+ # 绘制箱线图
scale_x_discrete(limits=c("Python语言","R语言"),name=("科目"))+ # 修改类别轴项目顺序
mytheme+ggtitle("(a) 修改类别轴项目顺序\n默认顺序R语言、Python语言")
# 图(b)坐标轴互换,并反转x轴元素的顺序
p2<-ggplot(data=df,aes(x=课程,y=分数,fill=课程))+
geom_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$课程)))+# 反转类别轴项目顺序
mytheme+ggtitle("(b) 坐标轴互换\n反转x轴元素的顺序并旋转90度")
# 图(c)移除y轴刻度线和标签,删除x轴和y轴次网格线
p3<-ggplot(data=df,aes(x=分数,fill=课程,alpha=0.2))+
geom_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)+
mytheme+ggtitle("(c) 移除y轴刻度线和y轴标签\n去掉x轴和y轴次网格线")
# 图(d)移除所有刻度线,刻度标签旋转90度
p4<-ggplot(data=df,aes(x=分数,fill=课程,alpha=0.2))+
geom_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.07),
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)+
mytheme+ggtitle("(d) 移除所有刻度线\nx轴刻度标签旋转90度")
grid.arrange(p1,p2,p3,p4,ncol=2) # 组合图形
# 初始图形,所有设置均为默认
p<-ggplot(data=df)+aes(x=课程,y=分数,fill=性别)+
geom_boxplot() # 绘制箱线图
# 设置标题
p1<-p+ggtitle("(a) 这里是标题(默认设置)") # 添加标题
p2<-p+ggtitle("(b) 这里是标题(设置字体大小,粗体字)")+
theme(plot.title=element_text(size=10,face="bold"))# 设置标题字体大小
p3<-p+labs(title=("(c) 这里是标题(标题位置居中)\n(标题换行)"))+ # 标题换行(在\n处断行)
theme(plot.title=element_text(size=12,hjust=0.5)) # 调整标题位置(居中)
p4<-p+ggtitle("(d) 这里是主标题(蓝色粗斜体)","(这里是副标题)")+ # 添加副标题
theme(plot.title=element_text(size=12,face="bold.italic",color="blue3")) # 设置标题为粗斜体字,蓝色
gridExtra::grid.arrange(p1,p2,p3,p4,ncol=2) # 组合图形
ggtitle()
中第一个参数为主标题,第二个参数为副标题;再通过主题函数theme(plot.title=element_text())
设置标题的具体属性
element_text()
为文本属性设定函数,一共有多少个参数可以设定?
约15个常用参数(如size, face,
color, hjust等)
element_text(size=10,face="bold") 代表什么意思?
size=10:这个参数设置了文本的字体大小为10。
face="bold":这个参数设置了文本的字体样式为粗体。face
参数可以取以下几个值:
"plain":普通字体(默认)。
"bold":粗体。
"italic":斜体。
"bold.italic":粗斜体。
element_text(size=12,hjust=0.5)代表什么意思?
size=12:这个参数将文本的大小设置为12。
hjust=0.5:这个参数控制文本的水平对齐方式。
0 表示左对齐。
0.5 表示居中对齐。
1 表示右对齐。
element_text(size=12,face="bold.italic",color="blue3")
代表什么意思?
size=12:设置文本的字体大小为12。
face="bold.italic":设置文本的字体样式为粗斜体。face
参数控制字体的样式,其中:
"plain" 表示普通字体(默认)。
"bold" 表示粗体。
"italic" 表示斜体。
"bold.italic" 表示粗斜体。
color="blue3":设置文本的颜色。
# 初始图形,所有设置均为默认
p<-ggplot(data=df)+aes(x=课程,y=分数,fill=性别)+
geom_boxplot() # 绘制箱线图
# 设置图例
p1<-p+ggtitle("(a) 默认图例")
p2<-p+ggtitle("(b) 移除图例")+
theme(legend.position="none") # 移除图例(或设置guides(fill="none"))
p3<-p+ggtitle("(c) 设置图例位置、字体、背景和边框颜色")+
theme(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))
# 设置图例键的颜色和线宽
p4<-p+ggtitle("(d) 设置图例位置、摆放方式和顺序")+
theme(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.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
gridExtra::grid.arrange(p1,p2,p3,p4,ncol=2) # 组合图形
theme()
函数中legend.text/legend.position/legend.background/legend.key
四个参数分别设定什么方面的内容?
legend.text:用于设置图例中文本标签的样式,它是一个element_text()对象,可以定义文本的字体、大小、颜色等属性。
legend.position:用于设置图例的位置,可以是
"top"、"bottom"、"left"、"right"
或者用两个数值的向量指定图例的精确位置。
legend.background:用于设置图例背景的样式,它是一个element_rect()对象,可以定义背景的填充色、边框等属性。
legend.key:用于设置图例中关键(key)部分的样式,同样是一个element_rect()对象,可以定义关键部分的填充色、边框等属性。
element_rect()
矩形对象属性设定函数,legend.background/legend.key
两个参数为什么需要用它设定?
因为图例的背景和关键部分在ggplot2中都是以矩形的形式存在的。通过element_rect(),可以对这些矩形元素的外观进行详细的自定义设置
修改图p3的代码,将图例位置改为图形下方,将图例标题legend.title”性别“的字体颜色也改为蓝色。
修改图p4的代码,将图例位置改为图中的右下方,图例中男左女右。
# 修改原绘图代码以满足要求
# 初始图形,所有设置均为默认
p<-ggplot(data=df)+aes(x=课程,y=分数,fill=性别)+
geom_boxplot() # 绘制箱线图
# 设置图例
p1<-p+ggtitle("(a) 默认图例")
p2<-p+ggtitle("(b) 移除图例")+
theme(legend.position="none") # 移除图例(或设置guides(fill="none"))
p3<-p+ggtitle("(c) 设置图例位置、字体、背景和边框颜色")+
theme(legend.text=element_text(size=8,color="blue"), # 设置图例字体大小和颜色
legend.position="bottom", # 设置图例位置(顶部)
legend.background=element_rect(fill="grey85",color="blue"),
# 设置图例背景色和边框颜色
legend.key=element_rect(color="blue",linewidth=0.25))
# 设置图例键的颜色和线宽
p4<-p+ggtitle("(d) 设置图例位置、摆放方式和顺序")+
theme(legend.position=c(0.80,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("男","女")) # 修改图例顺序
gridExtra::grid.arrange(p1,p2,p3,p4,ncol=2) # 组合图形
df<-data.frame(
专业=c("流行病和卫生统计","数据科学与大数据技术","数理统计"),
课程=c("Python机器学习原理与实践","数据建模","数据科学统计基础"),
平均分数=c(76,88,82))
# 绘制条形图
p<-ggplot(df)+aes(x=课程,y=平均分数,fill=专业)+
geom_col(width=0.8,color="grey50")
# 图(a)默认绘制
p1<-p+theme(panel.background=element_rect(fill="lightyellow"),# 设置图形面板背景色
plot.background=element_rect(fill="lightblue"))+# 设置图形整体背景色
ggtitle("(a) 默认绘制")
# 图(b)在适当位置折行
p2<-p+scale_x_discrete(labels=c("Python\n机器学习\n原理与实践","数据建模","数据科学\n统计基础"))+ # 将x轴的长标签折行
theme(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)设置标签文本宽度
p3<-p+scale_x_discrete(labels=function(x) str_wrap(x,width=8))+ # 设置x轴标签宽度
theme(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)))
R语言的”\“为转义符,"Python\n机器学习\n原理与实践"
中的\n表示什么意思?
表示换行符
grid.arrange()函数中参数设定layout_matrix=rbind(c(1,1),c(2,3))
表示什么意思?
grid.arrange() 函数,它是 gridExtra
包中的一个函数,用于在R中排列多个图形。layout_matrix
参数用于指定一个矩阵,这个矩阵定义了如何将图形排列在一个网格中。
第一行两个单元格合并为一个大单元格(由 c(1,1)
表示),可以放置一个图形。
第二行分为两个单元格,左边单元格放置第二个图形(由
c(2) 表示),右边单元格放置第三个图形(由 c(3)
表示)。
df <- data2_1 |> gather(R语言,Python语言,key=课程,value=分数)
p<-ggplot(data=df)+aes(x=课程,y=分数,fill=性别)+
geom_boxplot() # 绘制箱线图
p1<-p+theme_grey()+ggtitle("(a)+theme_grey") # 默认主题
p2<-p+theme_bw()+ggtitle("(b) theme_bw") # 黑白主题
p3<-p+theme_minimal()+ggtitle("(c) theme_minimal") # 最小主题
p4<-p+theme_classic()+ggtitle("(d) theme_classic") # 经典主题
gridExtra::grid.arrange(p1,p2,p3,p4,ncol=2) # 组合图形
除了ggplot2包自带的主题函数外,还有很多包提供主题函数。
library(ggthemes)
p1<-p+theme_economist_white()+ggtitle("(a) theme_economist_white") # 《经济学人》杂志白色主题
p2<-p+theme_excel()+ggtitle("(b) theme_excel") # Excel主题
p3<-p+theme_few()+ggtitle("(c) theme_few") # 少数人使用的图形主题
p4<-p+theme_stata()+ggtitle("(d) theme_stata") # 基于Stata图形方案的主题
gridExtra::grid.arrange(p1,p2,p3,p4,ncol=2) # 组合图形
试在Deepseek中提问”R语言中针对ggpolt函数绘图,有哪些主题包和主题函数?“
ggthemes包:这个包内置了许多类似ggplot2中theme的主题,提供了多样化的主题样式。
ggthemr包:另一个扩展主题包,提供了额外的主题样式。
ggtech包和ggsci包:这两个包提供了科技和科学领域专用的主题样式。
theme_grey():默认背景,浅灰色背景和白色网格线,无边框。
theme_bw():白色背景和浅灰色网格线,无边框。
theme_linedraw():白色背景和黑色网格线,黑色边框线。
theme_light():白色背景和浅灰色网格线,浅灰色边框。
theme_dark():灰黑色背景和灰色网格线,灰色/无边框。
theme_minimal():白色背景和浅灰色网格线,无边框。
theme_classic():具有x轴和y轴线条但没有网格线的经典外观主题。
theme_void():完全空白的主题。
ggthemes/hrbrthemes/ggpubr等包提供多种商业化绘图主题。选择四种你喜欢的主题设置,应用于案例绘图中。
library(ggthemes)
library(hrbrthemes)
library(ggpubr)
p5 <- p + theme_wsj() + ggtitle("(e) theme_wsj")
p6 <- p + theme_tufte() + ggtitle("(f) theme_tufte")
p7 <- p + theme_gdocs() + ggtitle("(g) theme_gdocs")
p2 <- p + theme_excel() + ggtitle("(b) theme_excel")
gridExtra::grid.arrange(p1, p2, p5, p6, p7, ncol=3)
d <- data2_1
p<-ggplot(data=d)+aes(x=R语言,y=Python语言)+
geom_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) # 添加线性回归线和置信带
# 添加注释
p+geom_vline(xintercept=mean(d$R语言),linetype="twodash",color="grey50",size=0.5)+ # 添加x的均值线(垂直线)
geom_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="grey85")+# 添加矩形
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.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## `geom_smooth()` using formula = 'y ~ x'
annotate()函数中参数parse=TRUE
有什么用,尝试将其删除观测结果变化。
"alpha"、"frac(x,y)"),删除
parse=TRUE 会直接显示原始字符串(如
"alpha"),而不解析为符号。普通文本(无数学符号)则无影响。案例绘图
df <- data2_1 |> gather(R语言,Python语言,key=课程,value=分数)
p1<-ggplot(data=df)+aes(x=课程,y=分数,fill=性别)+geom_boxplot()+
facet_wrap(~性别,ncol=2)+ # 按性别2列分面
ggtitle("(a) 按性别2列分面")
p2<-ggplot(data=df)+aes(x=课程,y=分数,fill=专业)+geom_boxplot()+
facet_grid(性别~.)+ # 按性别2行分面
ggtitle("(b) 按性别2行分面")
p3<-ggplot(data=df)+aes(x=课程,y=分数,fill=性别)+geom_boxplot()+
facet_wrap(~专业,ncol=3) + # 按专业3列分面
ggtitle("(c) 按专业3列分面")
p4<-ggplot(data=df)+aes(x=专业,y=分数,fill=专业)+geom_boxplot()+
facet_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) 按课程(行)和性别(列)分面")
gridExtra::grid.arrange(p1,p2,p3,p4,ncol=2) # 组合图形
分面函数facet_grid()如何使用?
facet_grid() 函数的基本语法是
facet_grid(rows ~ cols),其中 rows 和
cols
可以是变量名或者.(表示不进行分面)。例如,facet_grid(sex ~ day)
表示根据 sex 变量的不同水平进行行分面,根据
day 变量的不同水平进行列分面。
在主题函数theme()
中,以什么开头的参数控制绘图分面要素的属性?
以 strip.
开头的参数用于控制绘图分面要素的属性。例如:
strip.text.x:控制x轴分面标签的文本样式。
strip.text.y:控制y轴分面标签的文本样式。
strip.background:控制分面标签背景的矩形样式。
# 设置图形主题(可根据需要设置)
mytheme<-theme(plot.title=element_text(size="11"), # 设置主标题字体大小
axis.title=element_text(size=10), # 设置坐标轴标签字体大小
axis.text=element_text(size=9), # 设置坐标轴刻度字体大小
legend.position="none")
p1<-ggplot(data=df)+aes(x=性别,fill=性别)+
geom_bar(width=0.8)+ylab("人数")+ # 绘制条形图
mytheme+ggtitle("(a) 条形图")
p2<-ggplot(data=df)+aes(x=分数)+
geom_histogram(binwidth=5,fill="lightgreen",color="gray50")+# 绘制直方图
mytheme+ggtitle("(b) 直方图")
p3<-ggplot(data=df)+aes(x=专业,y=分数,fill=专业)+
geom_boxplot()+ # 绘制箱线图
mytheme+ggtitle("(c) 箱线图")
p4<-ggplot(data=df,aes(x=课程,y=分数,fill=课程))+
geom_violin()+ # 绘制小提琴图
mytheme+ggtitle("(d) 小提琴图")
p5<-ggplot(data=df)+aes(x=分数,fill=课程,alpha=0.2)+
geom_density()+ # 绘制核密度图
xlim(50,105)+ylim(0,0.07)+
mytheme+ggtitle("(e) 核密度图")
# 按行填充子图,行高比为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列的矩阵布局
# 按行填充子图,行高比为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列矩阵布局
# 按列填充子图,列宽比为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列矩阵布局