基础包中有一定的绘图函数,但为了满足作图的要求,可以优先考虑ggplot2
*ggplot2中通过不同的geom函数生成图层,从前往后覆盖,因此需要考虑函数书写的顺序
**ggplot2以+连接各个geom函数,不能漏
#ggplot的语法如下,可修改的是data,geom_开头的具体函数与aes后的横纵坐标
#ggplot的特殊语法:列名不带引号,行末写加号
ggplot(data = iris)+
geom_point(mapping = aes(x = Sepal.Length,
y = Petal.Length))
#2.属性设置(颜色、大小、透明度、点的形状,线型等)
#color(由表示颜色的字符串(如#666666代表象牙黑),或"blue","red"等表示),size,alpha,shape(由一组数字编号表示,或可以shape=""),fill(填充颜色)
#2.1 手动设置,需要设置为有意义的值
ggplot(data = iris) +
geom_point(mapping = aes(x = Sepal.Length,
y = Petal.Length),
color = "blue")
ggplot(data = iris) +
geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length),
size = 5, # 点的大小5mm
alpha = 0.5, # 透明度 50%
shape = 8) # 点的形状
#2.2 映射:按照数据框的某一列来定义图的某个属性
ggplot(data = iris)+
geom_point(mapping = aes(x = Sepal.Length,
y = Petal.Length,
color = Species)) #此时color是aes函数的参数,species是一个列名
## Q1 能不能自行指定映射的具体颜色?
ggplot(data = iris)+
geom_point(mapping = aes(x = Sepal.Length,
y = Petal.Length,
color = Species))+
scale_color_manual(values = c("blue","grey","red"))+ #颜色的标度手动设置为蓝灰红代替默认的红蓝绿
theme_classic()
#如果加上theme_classic则与ggpubr一样
#ggplot2“多余"的代码可能不报错,如上代码没写color=species不会报错
## Q2 区分color和fill两个属性
### Q2-1 空心形状和实心形状都用color设置颜色
ggplot(data = iris)+
geom_point(mapping = aes(x = Sepal.Length,
y = Petal.Length,
color = Species),
shape = 17) #17号,实心的例子
ggplot(data = iris)+
geom_point(mapping = aes(x = Sepal.Length,
y = Petal.Length,
color = Species),
shape = 2) #2号,空心的例子
### Q2-2 既有边框又有内心的,才需要color和fill两个参数
ggplot(data = iris)+
geom_point(mapping = aes(x = Sepal.Length,
y = Petal.Length,
color = Species),
shape = 24,
fill = "black") #24号,双色的例子
#3.分面
ggplot(data = iris) +
geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length)) +
facet_wrap(~ Species) #通过facet_wrap根据species分成不同的子图
#双分面
dat = iris
dat$Group = sample(letters[1:5],150,replace = T) #group是新的列名,新增列名为group的列
#sample函数从第一个实际参数中抽样生成长度等于第二个实际参数的向量,若后者较大,应保证replace=T(有放回的抽样)
ggplot(data = dat) +
geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length)) +
facet_grid(Group ~ Species) #根据group为横向,species为纵向分面
#用于分面的列需要取值有限且有重复值
#4.几何对象
#geom函数画出的所有对象为一个几何对象,可以理解为一个图层
#局部设置和全局设置
ggplot(data = iris) +
geom_smooth(mapping = aes(x = Sepal.Length,
y = Petal.Length))+
geom_point(mapping = aes(x = Sepal.Length,
y = Petal.Length))
ggplot(data = iris,mapping = aes(x = Sepal.Length, y = Petal.Length))+
geom_smooth()+
geom_point()
#ggplot函数的括号内的参数对全部geom适用
#5.统计变换-直方图
View(diamonds)
table(diamonds$cut)
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut)) #画柱状图,几何对象函数,y默认统计x的值及重复次数
ggplot(data = diamonds) +
stat_count(mapping = aes(x = cut)) #画个图展示count的数量,统计变换函数
#统计变换使用场景
#5.1.不统计,数据直接做图
fre = as.data.frame(table(diamonds$cut))
fre
ggplot(data = fre) +
geom_bar(mapping = aes(x = Var1, y = Freq), stat = "identity") #一定要写y的写法
#5.2count改为prop #需要统计比例时,用y=..prop..,group=1作为模板(将所有的组成部分的和作为1)
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut, y = ..prop.., group = 1))
#6.位置关系
# 6.1抖动的点图
ggplot(data = iris,mapping = aes(x = Species,
y = Sepal.Width,
fill = Species)) +
geom_boxplot()+
geom_point() #这张图有歧义,因为有可能有相同数值的点重叠
ggplot(data = iris,mapping = aes(x = Species,
y = Sepal.Width,
fill = Species)) +
geom_boxplot()+
geom_jitter() #geom_jitter将数值相同的点抖动
# 6.2堆叠直方图
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut,fill=clarity)) #堆叠式
# 6.3 并列直方图
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut, fill = clarity), position = "dodge") #position = "dodge"为并列式
#7.坐标系
#翻转coord_flip() #更换横纵坐标
ggplot(data = mpg, mapping = aes(x = class, y = hwy)) +
geom_boxplot() +
coord_flip()
#极坐标系coord_polar() #将原图变为极坐标系
bar <- ggplot(data = diamonds) +
geom_bar(
mapping = aes(x = cut, fill = cut),
width = 1
) +
theme(aspect.ratio = 1) +
labs(x = NULL, y = NULL)
bar
bar + coord_flip()
bar + coord_polar()
#绘图模板
#ggplot(data = <DATA>)+geom_function(mapping=aes(),stat = <>,position=<POSITION>)+<COORDINATE_FUNCTION>+facet
#图片保存的三种方法
#ggsave可以保存ggplot2与ggpubr的图
#1.基础包作图的保存
pdf("iris_box_ggpubr.pdf") #保存为pdf
pdf("test.pdf") #先写变量名
boxplot(iris[,1]~iris[,5])
text(6.5,4, labels = 'hello') #中间两行是画图代码
dev.off()#画图完毕,关闭画板
#2.ggplot系列图(包括ggpubr)通用的简便保存 ggsave
p <- ggboxplot(iris, x = "Species",
y = "Sepal.Length",
color = "Species",
shape = "Species",
add = "jitter")
ggsave(p,filename = "iris_box_ggpubr.png") #注意写好后缀
#3.eoffice包 导出为ppt,全部元素都是可编辑模式,但是在点过多的时候容易卡顿
library(eoffice)
topptx(p,"iris_box_ggpubr.pptx")
#https://mp.weixin.qq.com/s/p7LLLvzR5LPgHhuRGhYQBQ
#若代码可运行但不出图,应该考虑画板是否被占用,多次运行如下直至null device
dev.off()
#已经关闭了画板后会报错
#原来的不行也可以dev.new(),甚至重启
#附作业解答及注意事项
# 6-1
# 1.加载test.Rdata,分别test的以a和b列作为横纵坐标,change列映射颜色,画点图。
load(file = "test.Rdata")
ggplot(data = test)+
geom_point(mapping = aes(x = a,
y = b,
color = change))
# 2.尝试修改点的颜色为暗绿色(darkgreen)、灰色、红色
ggplot(data = test)+
geom_point(mapping = aes(x = a,
y = b,
color = change))+
scale_color_manual(values = c("darkgreen","grey","red")) #可以调整位置使颜色对应不同群的点
# 6-2
# 1.尝试写出下图的代码
library(ggplot2)
library(ggpubr)
ggboxplot(iris, x = "Species",
y = "Sepal.Width",
color = "Species",
shape = 1,
add = "jitter")
ggplot(data=iris,mapping=aes(x=Species,y=Sepal.Width,fill=Species))+geom_boxplot()
ggplot(data=iris,mapping=aes(x=Species,y=Sepal.Width,fill=Species))+geom_boxplot()+geom_jitter()#点重合在一起,需要抖动
# 2. 尝试在此图上叠加点图,
# 能发现什么问题?
pdf("data.pdf")
ggplot(data=iris)+
geom_violin(mapping=aes(x=Species,y=Sepal.Width,fill=Species))+
geom_boxplot(mapping=aes(x=Species,y=Sepal.Width))+
geom_jitter(mapping=aes(x=Species,y=Sepal.Width,shape=Species))+
coord_flip()
dev.off()
ggplot(iris,aes(x=Species,y=Sepal.Width))+ #形式参数可以省略
geom_violin(aes(fill=Species))+ #之所以不能不写aes是因为species不是一种颜色,而是一个颜色的映射
geom_boxplot()+
geom_jitter(aes(shape=Species))+
coord_flip()
# 6-3
# 任意作3张ggplot2图
library(ggplot2)
View(airquality)
aq=transform(airquality,Month=as.character(Month))
table(is.na(aq[,1]))
p1<-ggplot(data=aq,mapping=aes(x=Month,y=Ozone))+
geom_boxplot()+
geom_violin(aes(fill=Month))+
geom_jitter(aes(shape=Month))+
labs(title = "Airquality", subtitle = "Ozone", caption = "From May to Sep") #通过labs函数可以指定标题、小标题等
p1
p2<-ggplot(data=aq,mapping=aes(x=Temp))+
geom_bar(aes(fill=Month))+
xlab("Temperature")+ #通过xlab与ylab函数可以指定轴名
ylab("")+
coord_flip()
p2
p3<-ggplot(data = aq) +
geom_point(mapping = aes(x = Temp, y = Wind,color=Month,shape=Month)) +
facet_wrap(~ Month)
p3
library(patchwork)
library(ggplot2)
View(airquality)
ozone=transform(airquality,Month=as.character(Month))
p1<-ggplot(data=ozone,mapping=aes(x=Month,y=Ozone))+
geom_boxplot()+
geom_violin(aes(fill=Month))+
geom_jitter(aes(shape=Month))+
labs(title = "Airquality", subtitle = "Ozone", caption = "From May to Sep")
p1
p2<-ggplot(data=ozone,mapping=aes(x=Temp))+
geom_bar(aes(fill=Month))+
xlab("Temperature")+
ylab("")+
coord_flip()
p2
p3<-ggplot(data = ozone) +
geom_point(mapping = aes(x = Temp, y = Wind,color=Month,shape=Month)) +
facet_wrap(~ Month)
p3
p1
p2
p3
#排列的顺序
#两张图拼接,横着为+,竖着为/,三张同理
p1+p2+p3 #三张横向并排
p1+p2/p3 #p1位于左侧,p2及p3叠置位于右侧
(p1+p2)/p3 #p1及p2位于上方,p3位于下方
p1+p2+p3+plot_layout(nrow=3) #使用plot_layout及nrow、ncol指定行数或列数
layout='
AAB
CCB'
p1+p2+p3+plot_layout(design = layout) #使用layout给定排列方式
#标题与标记
pic=(p1/p2)|p3
pic
p1+p2+p3+plot_annotation(title = "Airquality",tag_levels = "A") #plot_annotation后title指定标题,tag_levels指定角标,可自动编号
(p1+p2+plot_layout(tag_level = 'new')) /p3+plot_annotation(tag_levels = c('A', '1')) #此处可自动编号两个维度
pic+plot_layout(guides = 'collect') #将所有图例移至右侧
#合并图例(本处图例不同,不能合并,故列出可合并的代码)
#patchwork <- patchwork & scale_fill_continuous(limits = c(0, 60))
#patchwork + plot_layout(guides = 'collect')
#统一修改子图
pic & theme_minimal()
ggsave("pic.png",width = 210,height = 297,units = "mm") #ggsave可以指定宽、高等
本文本根据生信技能树资料整理
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。