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.07)+ # 设置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、p4ggplot2包简介
1 ggplot2绘图语法
1.1 案例绘图
ggplot函数指定要绘图的数据(通常是数据框),并生成一个空的图形对象(不生成图形)aes(x,y,…)函数用于指定图形属性的映射,其中的x用于指定坐标轴x的变量或数值,y用于指定坐标轴y的变量或数值geom是几何的缩写,表示要绘制的几何对象,在下划线“_”后面指定要绘制的几何图形ggplot2的绘图语法是将各个部分用“+”连接起来使用
theme函数设置图形主题,用于控制或修改图形外观
1.2 思考与代码修改
aes()函数的fill参数有什么用?aes()函数既可以嵌套在ggplot()中作全局设定,也可以提取出外通过’+’连接作局部设定。aes()中的fill参数用于指定图形中填充颜色的变量,它会根据变量的不同值自动分配不同的填充颜色。例如,在p1中fill=性别表示按性别用不同颜色填充条形。修改p1的代码中
aes()提取出ggplot()函数放到geom_bar(),看能不能运行?aes()可以放在ggplot()中(全局设定,影响所有图层),也可以放在具体的geom_*函数中(局部设定,仅影响该图层)。geom_bar/geom_boxplot/geom_density/geom_point分别代表绘制什么图形?geom_bar():条形图(用于分类变量的频数统计)。geom_boxplot():箱线图(展示数据分布的五数概括:最小值、Q1、中位数、Q3、最大值)。geom_density():核密度图(展示连续变量的概率密度分布)。geom_point():散点图(展示两个连续变量的关系)。
facet_wrap()函数有什么用?在图p2代码中如果注释到这行会有什么后果。facet_wrap()用于分面绘图,根据指定的分类变量将数据拆分到多个子图中显示。如果注释掉
facet_wrap(~性别),p2会变成一张不分面的箱线图,男性和女性的数据会混合显示在同一组箱线图中(按fill=性别区分填充颜色)。
aes(x=分数,fill=课程,alpha=0.2)中fill参数代表填充颜色,试将图p3中的fill参数改为color看有什么效果?效果变化:
fill控制填充颜色,color控制边框/线条颜色。核密度图的曲线颜色会按课程区分,但填充区域不再有颜色(因为
geom_density()默认用fill填充区域)。
geom_point(size=3,shape=21,color="black")中shape参数代表点的形状,试将图p4中shape参数取值改为25看有什么效果?- 效果:
shape=25是“下三角形”符号(需配合fill参数显示填充颜色,边框由color控制)。
- 效果:
代码
grid.arrange(p1,p2,p3,p4,ncol=2)有什么用?相当于graphic包的什么代码?作用:将
p1-p4四个图形按2列排列组合成一张综合图形。graphics包等价代码:
par(mfrow=c(2,2))+ 分别绘制四个图(但ggplot2图形无法直接用par(),需配合grid包或其他方法)。
# 修改原绘图代码以满足要求
p1 <- ggplot(data=df) +
geom_bar(aes(x=性别, fill=性别)) +
ylab("人数") +
mytheme +
ggtitle("(a) 条形图")
p3 <- ggplot(data=df, aes(x=分数, color=课程, alpha=0.2)) +
geom_density() +
xlim(50,105) +
ylim(0,0.07)
p4 <- ggplot(data=data2_1, aes(x=R语言, y=Python语言, fill=性别)) +
geom_point(size=3, shape=25, color="black") +
facet_wrap(~性别)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())
# 设置图形主题(可根据需要设置)
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语言"))+ # 修改类别轴项目顺序
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.07)+ # 设置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) # 组合图形2.2 思考与代码修改
ggplot2包通过theme()函数设置主题要素参数,如何实现全局设定和局部设定?全局设定:
在ggplot()初始化时通过theme()设置,会影响所有图层和图形元素。局部设定:
在具体图层(如geom_*或annotate)后通过+ theme()覆盖全局设置,仅影响当前图层。例如:scale_x_discrete()函数有什么作用?如何将p1的横轴标题由“课程”改为“科目”。作用:
用于调整离散型(分类)x轴的属性,包括:修改类别顺序(
limits参数)。修改轴标题(
name参数)。修改标签文本(
labels参数)。
修改横轴标题为“科目”:
在p1中添加name参数
将图p2注释掉
theme(axis.text.y=element_text(size=9,angle=90,hjust=0.5,vjust=0.5))有什么影响?原代码效果:
y轴标签(课程名称)旋转90度,水平和垂直居中(hjust=0.5, vjust=0.5)。注释后的影响:
y轴标签恢复默认状态(水平显示,左对齐),可能导致标签重叠或显示不全(尤其是长文本)。
annotate()函数除了能在图中添加文本注释还能添加什么?将p3中“R语言”的文本注释放在蓝色区域的右边。其他功能:
除了文本("text"),还可添加:线段(
"segment")矩形(
"rect")箭头(
"segment"+arrow)点(
"point")
将“R语言”注释移到蓝色区域右侧:
调整x坐标至核密度曲线右侧(如x=95):
将p4的x轴刻度标签角度改为45度
修改方法:
调整theme(axis.text.x=...)中的angle参数:
# 修改原绘图代码以满足要求
mytheme<-theme(plot.title=element_text(size="11"), # 设置主标题字体大小
axis.title=element_text(size=10), # 设置坐标轴标签字体大小
axis.text=element_text(size=9), # 设置坐标轴刻度字体大小
legend.position="none") # 移除图例
# 假设df结构正确的情况下
p1 <- ggplot(data = df, aes(x = 课程, y = 分数, fill = 课程)) +
geom_boxplot() +
scale_x_discrete(
limits = c("Python语言", "R语言"),
name = "科目"
) +
theme(
plot.title = element_text(size = 11),
axis.title = element_text(size = 10),
axis.text = element_text(size = 9),
legend.position = "none"
) +
ggtitle("(a) 修改类别轴项目顺序")
print(p1)p3 <- ggplot(data=df, aes(x=分数, fill=课程, alpha=0.2)) +
geom_density() +
xlim(50, 105) +
annotate("text", x=95, y=0.015, label="R语言", size=3) # 修改x坐标
p4 <- ggplot(data=df, aes(x=分数, fill=课程, alpha=0.2)) +
geom_density() +
theme(
axis.text.x=element_text(angle=45, hjust=1, vjust=1) # 角度45度,右对齐
)3 图形外观——设置图形标题
3.1 案例绘图
# 初始图形,所有设置均为默认
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) # 组合图形3.2 思考
ggtitle()中第一个参数为主标题,第二个参数为副标题;再通过主题函数theme(plot.title=element_text())设置标题的具体属性element_text()为文本属性设定函数,一共有多少个参数可以设定?family:字体家族(如 “serif”, “sans”, “mono” 等)face:字体样式(如 “plain”, “bold”, “italic”, “bold.italic”)colour或color:文本颜色(如 “red”, “#FF0000”)size:文本大小(单位为磅,默认 11)hjust:水平对齐(0=左对齐,0.5=居中,1=右对齐)vjust:垂直对齐(0=底部对齐,0.5=居中,1=顶部对齐)angle:旋转角度(如 0, 45, 90 等)lineheight:行高(倍数,如 1.2)margin:外边距(如margin(t=10, r=20, b=30, l=40))debug:调试模式(逻辑值,TRUE/FALSE)
element_text(size=10,face="bold")代表什么意思?size=10:设置文本大小为 10 磅。face="bold":设置文本为粗体。整体含义:将标题文本设置为 10 磅、粗体。
element_text(size=12,hjust=0.5)代表什么意思?size=12:设置文本大小为 12 磅。hjust=0.5:设置文本水平居中对齐(0=左对齐,0.5=居中,1=右对齐)。整体含义:将标题文本设置为 12 磅、居中对齐。
element_text(size=12,face="bold.italic",color="blue3")代表什么意思?size=12:设置文本大小为 12 磅。face="bold.italic":设置文本为 粗斜体。color="blue3":设置文本颜色为深蓝色(“blue3” 是 R 中的一种预定义颜色)。整体含义:将标题文本设置为 12 磅、粗斜体、深蓝色。
4 图形外观——设置图例
4.1 案例绘图
# 初始图形,所有设置均为默认
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.
gridExtra::grid.arrange(p1,p2,p3,p4,ncol=2) # 组合图形4.2 思考与代码修改
theme()函数中legend.text/legend.position/legend.background/legend.key四个参数分别设定什么方面的内容?legend.text- 控制图例中文本的样式(如字体大小、颜色等)legend.position- 控制图例在图形中的位置(如”top”, “bottom”, “left”, “right”或坐标位置)legend.background- 控制图例背景的样式legend.key- 控制图例中每个图例键(即颜色块)的样式
element_rect()矩形对象属性设定函数,legend.background/legend.key两个参数为什么需要用它设定?图例背景是一个矩形区域
图例键(颜色块)也是矩形形状
所以需要用element_rect()来设置它们的填充色、边框色、线宽等矩形属性。
修改图p3的代码,将图例位置改为图形下方,将图例标题
legend.title”性别“的字体颜色也改为蓝色。修改图p4的代码,将图例位置改为图中的右下方,图例中男左女右。
# 修改原绘图代码以满足要求
# 修改p3的代码
p3 <- p + ggtitle("(c) 设置图例位置、字体、背景和边框颜色") +
theme(legend.text = element_text(size = 8, color = "blue"), # 设置图例字体大小和颜色
legend.title = element_text(color = "blue"), # 设置图例标题字体颜色为蓝色
legend.position = "bottom", # 设置图例位置为底部
legend.background = element_rect(fill = "grey85", color = "grey"),
# 设置图例背景色和边框颜色
legend.key = element_rect(color = "blue", linewidth = 0.25))
# 设置图例键的颜色和线宽
# 修改p4的代码
p4 <- p + ggtitle("(d) 设置图例位置、摆放方式和顺序") +
theme(legend.position = c(0.9, 0.1), # 设置图例位置为右下方
legend.background = element_blank(), # 移除图例整体边框
legend.text = element_text(size = 8), # 设置图例字体大小
legend.direction = "horizontal") + # 设置图例水平排列
guides(fill = guide_legend(nrow = 1, title = NULL, reverse = TRUE)) +
# 设置图例摆放方式(1行,去掉图例标题,反转顺序)
scale_fill_discrete(limits = c("女", "男")) # 修改图例顺序
gridExtra::grid.arrange(p1, p2, p3, p4, ncol = 2) # 组合图形5 图形外观——长标签处理
5.1 案例绘图
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))) 5.2 思考
R语言的”
\“为转义符,"Python\n机器学习\n原理与实践"中的\n表示什么意思?在 R 语言(以及大多数编程语言)中,
\n是换行符(newline),用于在字符串中强制换行。grid.arrange()函数中参数设定layout_matrix=rbind(c(1,1),c(2,3))表示什么意思?第一行:
c(1,1)→ 图 1 占据第一行的两列(即图 1 宽度是图 2 或图 3 的两倍)。第二行:
c(2,3)→ 图 2 和图 3 并排,各占一列。
6 图形外观——使用已有图形主题
6.1 案例代码
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)Warning: package 'ggthemes' was built under R version 4.3.3
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) # 组合图形6.2 思考与代码修改
试在Deepseek中提问”R语言中针对ggpolt函数绘图,有哪些主题包和主题函数?“
6.2.0.1 内置主题(
ggplot2自带)theme_grey()(默认)theme_bw()(黑白网格)theme_minimal()(简洁无背景)theme_classic()(经典无网格)theme_void()(完全空白)
6.2.0.2 扩展主题包
ggthemes提供商业化主题(如经济学人、Excel、Stata等):
theme_economist()theme_excel()theme_stata()theme_fivethirtyeight()(538风格)
hrbrthemes专注于现代、干净的风格:
theme_ipsum()(Arial字体,适合出版)theme_ft_rc()(FT风格深色主题)
ggpubr面向科研和出版:
theme_pubr()(简洁风格,支持期刊格式)
其他
cowplot::theme_cowplot()(适合学术论文)tvthemes::theme_avatar()(动画风格)
ggthemes/hrbrthemes/ggpubr等包提供多种商业化绘图主题。选择四种你喜欢的主题设置,应用于案例绘图中。
library(ggthemes)
library(hrbrthemes)Warning: package 'hrbrthemes' was built under R version 4.3.3
library(ggpubr)Warning: package 'ggpubr' was built under R version 4.3.3
library(cowplot)Warning: package 'cowplot' was built under R version 4.3.3
Attaching package: 'cowplot'
The following object is masked from 'package:ggpubr':
get_legend
The following object is masked from 'package:ggthemes':
theme_map
The following object is masked from 'package:lubridate':
stamp
p1 <- ggplot(df, aes(x = 课程, y = 分数, fill = 性别)) +
geom_boxplot() +
theme_cowplot() + # 学术风格主题
scale_fill_manual(values = c("#1F77B4", "#FF7F0E")) + # 自定义颜色
ggtitle("(a) 学术风 (cowplot)") +
labs(x = "课程", y = "分数")
library(hrbrthemes)
p2 <- ggplot(df, aes(x = 课程, y = 分数, fill = 性别)) +
geom_boxplot() +
theme_ipsum() + # 极简风格主题
scale_fill_ipsum() + # 配套配色
ggtitle("(b) 极简风 (hrbrthemes)") +
labs(x = "课程", y = "分数")
library(ggthemes)
p3 <- ggplot(df, aes(x = 课程, y = 分数, fill = 性别)) +
geom_boxplot() +
theme_economist() + # 《经济学人》风格
scale_fill_economist() + # 配套配色
ggtitle("(c) 商业风 (ggthemes)") +
labs(x = "课程", y = "分数")
library(gridExtra)
grid.arrange(p1, p2, p3, ncol = 2)Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): font family
not found in Windows font database
Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): font family
not found in Windows font database
Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): font family
not found in Windows font database
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
family not found in Windows font database
Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): font family
not found in Windows font database
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
family not found in Windows font database
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
family not found in Windows font database
Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
family not found in Windows font database
Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
font family not found in Windows font database
Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
font family not found in Windows font database
Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
font family not found in Windows font database
Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
font family not found in Windows font database
Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
font family not found in Windows font database
Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
font family not found in Windows font database
7 添加注释
7.1 案例绘图
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.
`geom_smooth()` using formula = 'y ~ x'
7.2 思考
annotate()函数中参数parse=TRUE有什么用,尝试将其删除观测结果变化。parse=TRUE的作用是将文本标签解析为数学表达式(支持 LaTeX 语法)。如何将相关性公式的背景框颜色去掉?
当前代码中,背景框是通过
geom_rect()添加的灰色矩形。直接删除或注释掉这行代码即可移除背景框:
8 图形分面
案例绘图
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) # 组合图形8.1 思考
分面函数
facet_grid()如何使用?rows:指定分面的行变量(公式左侧,如性别~.表示按性别分行)。cols:指定分面的列变量(公式右侧,如~.课程表示按课程分列)。.:表示不分组(如性别~.仅按行分面,无列分面)。
在主题函数
theme()中,以什么开头的参数控制绘图分面要素的属性?在
theme()函数中,以strip.开头的参数控制分面要素的样式:文本样式:
strip.text:分面标签文本(如字体、颜色)。strip.text.x/strip.text.y:分别控制x轴(列)和y轴(行)标签。
背景样式:
strip.background:分面标签背景(如填充色、边框)。strip.background.x/strip.background.y:分别控制列和行标签背景。
间距调整:
panel.spacing:子图之间的间距(全局)。panel.spacing.x/panel.spacing.y:分别控制水平和垂直间距。
9 图形组合
9.1 案例绘图
# 设置图形主题(可根据需要设置)
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) 核密度图")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列矩阵布局