前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R语言 基础作图

R语言 基础作图

原创
作者头像
Magnolia
修改2023-01-07 16:27:40
1.4K0
修改2023-01-07 16:27:40
举报
文章被收录于专栏:R语言学习——Magnolia

ggplot2

基础包中有一定的绘图函数,但为了满足作图的要求,可以优先考虑ggplot2

*ggplot2中通过不同的geom函数生成图层,从前往后覆盖,因此需要考虑函数书写的顺序

**ggplot2以+连接各个geom函数,不能漏

代码语言:javascript
复制
#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

图片的保存

代码语言:javascript
复制
#图片保存的三种方法
#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(),甚至重启

#附作业解答及注意事项

代码语言:javascript
复制
# 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

patchwork的运用

代码语言:javascript
复制
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

p1.png
p1.png

p2

p2.png
p2.png

p3

p3.png
p3.png
代码语言:javascript
复制
#排列的顺序
#两张图拼接,横着为+,竖着为/,三张同理
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给定排列方式
p1+p2+p3.png
p1+p2+p3.png
p1+p2/p3.png
p1+p2/p3.png
(p1+p2)/p3.png
(p1+p2)/p3.png
p1+p2+p3+plot_layout(nrow=3).png
p1+p2+p3+plot_layout(nrow=3).png
last.png
last.png
代码语言:javascript
复制
#标题与标记
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可以指定宽、高等
p1+p2+p3+plot_annotation(title = "Airquality",tag_levels = "A") .png
p1+p2+p3+plot_annotation(title = "Airquality",tag_levels = "A") .png
(p1+p2+plot_layout(tag_level = 'new')) /p3+plot_annotation(tag_levels = c('A', '1')) .png
(p1+p2+plot_layout(tag_level = 'new')) /p3+plot_annotation(tag_levels = c('A', '1')) .png

本文本根据生信技能树资料整理

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • ggplot2
  • 图片的保存
  • patchwork的运用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档