#设置镜像
options("repos"=c(CRAN="http://mirrors.tuna.tsinghua.edu.cn/CRAN/"))
#安装R包
if(!require(ggplot2))install.packages('ggplot2',update = F,ask = F)
if(!require(ggpubr))install.packages('ggpubr',update = F,ask = F)
if(!require(eoffice))install.packages("eoffice",update = F,ask = F)
if(!require(patchwork))install.packages("patchwork",update = F,ask = F)
#加载以检查是否安装成功
library(ggplot2)
library(ggpubr)
library(eoffice)
library(patchwork)
base包、ggplot2、ggpubr(ggpubr对ggplot2进行了简化和美化,适用于新手入门,可操作空间较小)
#示例体验
#1.基础包 略显陈旧 了解一下
plot(iris[,1],iris[,3],col = iris[,5])
text(6.5,4, labels = 'hello')
dev.off() #关闭画板
#2.ggplot2 中坚力量,语法有个性
library(ggplot2)
ggplot(data = iris)+
geom_point(mapping = aes(x = Sepal.Length,
y = Petal.Length,
color = Species))
#3.ggpubr 新手友好型 ggplot2简化和美化 褒贬不一
library(ggpubr)
ggscatter(iris,
x="Sepal.Length",
y="Petal.Length",
color="Species")
par里的mfrow、grid.arrange、cowplot、customLayout、patchwork(最新的、兼容性好、代码简单,用这一个就够够的了)
ggsave(是ggplot2里的一个函数)、eoffice-topptx(把图片导成ppt)、经典三段论
画完整的图用的,可以单独运行;
用于给图片添加点/线/标注;不能单独运行;
plot(iris[,1],iris[,3],col = iris[,5]) #画图
#给图片加标注
text(6.5,4, labels = 'hello') #没有前一行的话这行单独运行不了的
列名行名输入时不带引号,行末写+号连接不同函数(最后一行不用);
仅指定数据和横纵坐标;
实例:
ggplot(data = iris)+
geom_point(mapping = aes(x = Sepal.Length,
y = Petal.Length)
① 手动设置(不常用)
手动设置可以指定的属性包括:
颜色color——可指定的参数是字符串型的颜色名称,“blue”,“red”;
填充颜色fill,跟color可选的范围相同;
大小size——单位是mm;
透明度alpha;
形状shape,不同形状有0-20的代号;
实例:
#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))
③ 映射 vs 手动设置
映射中,color
是aes的参数,输入不带引号的列名;手动设置时 color
是geom_point
的参数,要求是带引号的颜色名称;
手动设置设置多个颜色非常出力不讨好,跟数据关联起来了再指定颜色就好;
映射也可以手动修改映射到的颜色而不必使用默认分配的颜色,具体操作为用scale_color_manual(values = c("blue","grey","red"))
来指定;
注:其中颜色不仅可以用“blue”这样的名字来指定,还可以使用十六进制颜色代码来指定,这样想要什么颜色就有什么颜色;
实例:
## Q1 能不能自行指定映射的具体颜色?
ggplot(data = iris)+
geom_point(mapping = aes(x = Sepal.Length,
y = Petal.Length,
color = Species))+
scale_color_manual(values = c("blue","grey","red"))
#手动设置设置多个颜色非常出力不讨好,跟数据关联起来了再指定颜色就好;
## 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两个参数,color管边框的颜色,fill管填充的颜色;
ggplot(data = iris)+
geom_point(mapping = aes(x = Sepal.Length,
y = Petal.Length,
color = Species),
shape = 24,
fill = "black") #24号,双色的例子
用facet_wrap(~)
函数把一张图分成多张子图,~ 前面是横着分面的参数,~ 后面是竖着分的参数;
小贴士:不要修改内置数据,因为你忘记你改过它就会开始怀疑人生。
#3.分面
ggplot(data = iris) +
geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length)) +
facet_wrap(~ Species)
#双分面
dat = iris
dat$Group = sample(letters[1:5],150,replace = T)
#sample是抽样,replace = T表示是不放回的抽样,抽样数不能大于样本总数;
ggplot(data = dat) +
geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length)) +
facet_grid(Group ~ Species)
# 1.加载test.Rdata,分别test的以a和b列作为横纵坐标,change列映射颜色,画点图。
load("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"))
# 补充知识:如何修改图形中标注
# 画图
p <- ggplot(df, aes(x = x, y = y)) + geom_point()
# 修改列名
p <- p + labs(x = "新的 x 轴标签", y = "新的 y 轴标签", title = "新的图形标题")
用geom_point
这样的函数画出来的点就是一个几何对象,一个箱线图也是一个几何对象,一个线图+其阴影也是一个几何对象;即一个函数画出来的所有东西是一个几何对象;
不同的几何对象可以叠加;
#直接叠加——局部设置(仅对当前图层有效),较为啰嗦;
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()
以geom
开头的函数是几何对象函数;
以stat
开头的函数是统计变换函数;
一般来说不用stat
开头的函数;
View(diamonds)
table(diamonds$cut)
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut))
ggplot(data = diamonds) +
stat_count(mapping = aes(x = cut)) #统计并可视化
#这两个函数都能画出来一个柱状图
#只指定了x,纵坐标是统计得到的数量
#6.1.不统计,数据直接做图
fre = as.data.frame(table(diamonds$cut))
fre
ggplot(data = fre) +
geom_bar(mapping = aes(x = Var1, y = Freq), stat = "identity")
#stat = "identity"就可以避免统计而是使用给定的统计结果直接作图
#6.2 不统计直接的数量而是统计比例——将count
改为prop
:
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut, y = ..prop.., group = 1))
#为了和y=某列名进行区分,需要再prop前后加两个..;
#group = 1是指把所有的数据作为一个整体,否则会把每一个柱子都画成1;
尝试写出下图的代码;尝试在此图上叠加点图。
# 1.尝试写出下图的代码
ggplot(data = iris,mapping = aes(x = Species,
y = Sepal.Width,
color = Species))+
geom_boxplot()
#这样画出来是空心的彩色的,给的示例图是填充彩色边框黑色,所以应该用fill指定颜色:
ggplot(data = iris,mapping = aes(x = Species,
y = Sepal.Width,
fill = Species))+
geom_boxplot()
# 2. 尝试在此图上叠加点图,
ggplot(data = iris,mapping = aes(x = Species,
y = Sepal.Width,
fill = Species)) +
geom_boxplot()+
geom_point()
# 这样画出来point有重叠,species本来每组应该有50个点;仅看图片看不出来实际上有50个点,会造成歧义;
#解决办法:用 geom_jitter() 函数防止重叠,把横坐标不限制到一个位置,而是“抖动一下”
ggplot(data = iris,mapping = aes(x = Species,
y = Sepal.Width,
fill = Species)) +
geom_boxplot()+
geom_jitter()
练习6-2中提到的geom_jitter()
函数用于设置横坐标区域就是一种位置调整;
此外还有堆叠式直方图v.s.并列式直方图这种位置调整,二者可以用position=doge
这一参数进行变换;
#普通的点图
ggplot(data = iris,mapping = aes(x = Species,
y = Sepal.Width,
fill = Species)) +
geom_boxplot()+
geom_point()
# 7.1 抖动的点图
ggplot(data = iris,mapping = aes(x = Species,
y = Sepal.Width,
fill = Species)) +
geom_boxplot()+
geom_jitter()
# 7.2堆叠直方图
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut,fill=clarity))
# 7.3 并列直方图
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut, fill = clarity), position = "dodge")
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()
画出这个图:
answer:
ggplot(data = iris,mapping = aes(x = Species,y = Sepal.Width))+
geom_violin(aes(fill = Species))+
geom_boxplot()+
geom_jitter(aes(shape = Species))+
coord_flip()
相比ggplot2,ggpubr淡化了映射和手动设置的区别,淡化了图层的概念,更加简单好上手;深入后还是需要回归到ggplot2;
ggpubr 搜代码直接用,基本不需要系统学习;
sthda上有大量ggpubr出的图,可以套用;
library(ggpubr)
ggscatter(iris,x="Sepal.Length",
y="Petal.Length",
color="Species")
#在ggplot2后+theme=classic可以去掉背景的灰色和格子,达到ggpur的主题效果;
#要把ggplot2的图例从右边挪到头顶改怎么办?
theme(legend.position = "top")
p <- ggboxplot(iris, x = "Species",
y = "Sepal.Length",
color = "Species",
shape = "Species",
add = "jitter")
p
#可以画出类似练习6-1的图
比较前,comparisons参数的数据要求:把三组需要两两比较的数据两个两个组成一个向量,放到一个list里面;
my_comparisons <- list( c("setosa", "versicolor"),
c("setosa", "virginica"),
c("versicolor", "virginica") )
p + stat_compare_means(comparisons = my_comparisons)+ # Add pairwise comparisons p-value
stat_compare_means(label.y = 9) #把比较结果放到y=9的位置
p <- ggboxplot(iris, x = "Species",
y = "Sepal.Length",
color = "Species",
shape = "Species",
add = "jitter")
ggsave(p,filename = "iris_box_ggpubr.png")
#注意:图片的后缀名相当关键
pdf("iris_box_ggpubr.pdf") #注意前后的pdf要对应,保存png的话要把两个pdf都改成png,否则图出不来;
boxplot(iris[,1]~iris[,5])
text(6.5,4, labels = 'hello')
dev.off() #画完图以后关闭画板
library(eoffice)
topptx(p,"iris_box_ggpubr.pptx")
注:不要过度依赖eoffice,拼图用贼好用的patchwork可以有效避免重复劳动!!!而且语法简单,兼容ggplot2。
patchwork特点:
支持p1+p1直接拼图,比任何包都简单;
复杂的布局代码易读性强;
可以给子图添加标记,如ABCD,I II III IV;
可以统一修改所有子图;
可以将子图的图例移到一起;
dev.off() #回复null device,已关闭画板还运行会报错,报错没关系
dev.new() #新建画板
现成的代码不难找——
① 火山图、热图直接到搜索引擎搜代码;
② STHDA网站上找代码、数据、教程;
③ 扩展资料-R_03工作目录下的各种扩展学习(基础包500行代码&ggplot2的50个实例)
④ 生信星球制作发布的画图合辑
——扩展学习:因子factor,用来自行控制横纵坐标;
① 我的数据适合用什么图展示?
② 从类似的文章里参考对比、其他学习资料涉及的图片;
③ 搜索画图代码的要求:代码可复制、图片美观;提供了代码配套的示例数据;示例代码+示例数据可复现;
④ 仿制示例数据:比较数据类型&数据结构,将自己的数据调成与示例数据一致;包括组织方式(转置解决)、对应关系等等;
⑤ 套代码,调细节;
tips:
画图最重要的是实践!多画多看才会越来越强!
数据组织往往比后面的调代码更加重要!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。