# 4 修改细节
# 4.1 坐标系 coordinate system
coord_cartesian () # 笛卡尔坐标(默认)
coord_fixed () # 具有固定纵横比的直角坐标
coord_flip # x 和 y 翻转 (笛卡尔坐标)
coord_polar () # 极坐标
coord_trans () # 变换笛卡尔坐标系,接收函数名
coord_quickmap ()
coord_map ) # 地图投影 projections:{mercator (default), azequalarea, lagrange, etc.}
## 举例
setwd ( "" )
library ( ggplot2 )
library ( ggsci )
library ( patchwork )
head ( irish )
ggplot ( mpg , aes ( hwy )) +
geom_bar ( aes ( fill = ..x.. )) +
theme_light () +
scale_fill_distiller ( palette = "YlGnBu" ) +
ggtitle ( 'p1 原始图' )
ggplot ( mpg , aes ( hwy )) +
geom_bar ( aes ( fill = ..x.. )) +
theme_light () +
scale_fill_distiller ( palette = "YlGnBu" ) +
coord_flip () + # 坐标反转
ggtitle ( 'p2 横纵坐标翻转' )
ggplot ( mpg , aes ( hwy )) +
geom_bar ( aes ( fill = ..x.. )) +
theme_light () +
scale_fill_distiller ( palette = "YlGnBu" ) +
coord_polar ( theta = "x" ) + # 坐标反转
ggtitle ( 'p3 x轴极坐标' )
ggplot ( mpg , aes ( hwy )) +
geom_bar ( aes ( fill = ..x.. )) +
theme_light () +
scale_fill_distiller ( palette = "YlGnBu" ) +
coord_polar ( theta = "y" ) + # 坐标反转
ggtitle ( 'p4 y轴极坐标' )
# 这里括号里还可以更改两个参数,start 和 direction 和clip
# srart表示从哪里开始,默认是12点钟方向
# direction 可以是1 或者 -1,分别表示顺时针转和逆时针转动
# clip 可以选择 on 或者 off, 这个默认(on)就好了
ggplot ( mpg , aes ( hwy )) +
geom_bar ( aes ( fill = ..x.. )) +
theme_light () +
scale_fill_distiller ( palette = "YlGnBu" ) +
coord_polar ( theta = "y" , start = pi / 2 , direction = -1 ) + # 坐标反转
ggtitle ( 'p5 y轴极坐标,改变起点和转的方向' )
jpeg ( filename = "fig4.1.jpeg" , width = 6000 , heigh = 6000 , units = "px" , res = 600 )
p1 + p2 + p3 + p4 + p5 + plot_layout ( ncol = 2 )
dev.off ()
fig 4.1
## 下面举个带坐标轴的例子
install.packages("maps")
library(maps)
world <- map_data("world")
ggplot(world, aes(x = long, y = lat, group = group)) +
geom_path() +
scale_y_continuous(breaks = (-2:2) * 30) +
scale_x_continuous(breaks = (-4:4) * 45)+
theme_light()+
ggtitle('p6 世界地图')
install.packages("mapproj")
library(mapproj)
p6 + coord_map("ortho", orientation = c(41, -74, 0))+
ggtitle('p6 世界地图变成球体')
jpeg(filename="fig4.2.jpeg",width=8000,heigh=4000,units="px",res=600)
p6+p7+plot_layout(ncol = 2)
dev.off()
fig 4.2
# 4.2 出图排版
## 我们看到,上面例子里不管是5个图还是两个图,
## 排版的这个样子不太好看
## 所以今天来给大家展示另外一种出多图的方式
# ggpubr中的ggrange()
install.packages("ggpubr")
library(ggpubr)
jpeg(filename="fig4.3.jpeg",width=6000,heigh=2000,units="px",res=600)
ggarrange(p1,p2,p3, # 把需要的图放进去
labels=c("A","B","C"), # 给每一张图价格label
ncol=3, nrow=1) #设置行列
dev.off()
fig 4.3
## 现在,如果我需要将原来的图按照第一行2个图,第二行三个图这么排列
## 那我就需要用到ggrange()的嵌套
jpeg(filename="fig4.4.jpeg",width=7000,heigh=4000,units="px",res=600)
ggarrange(nrow = 2, # 需要两行
ggarrange(p1,p2,labels=c("a","b"),ncol=2), # 第一行为散点图
ggarrange(p3,p4,p5, ncol = 3, labels = c("c","d","e"))) # 第二行为箱线图和点图
dev.off()
fig 4.4
## 当然你也可以一张一张的把图出出来,然后再用PS或者别的软件拼起来也可以
## grid.layout()
## 这里又有问题了,在同一行里,我想让第一个小图宽一点,第二个小图窄一点怎么办呢
## 这就可以用到grid包里的grid.layout()了
install.packages('grid')
library("grid")
jpeg(filename="fig4.5.jpeg",width=7000,heigh=6000,units="px",res=600)
grid.newpage()
pushViewport(viewport(layout = grid.layout(4,3)))
print(p6, vp = viewport(layout.pos.row = 1:2, layout.pos.col = 1:3)) # 跨2行3列
print(p2, vp = viewport(layout.pos.row = 3, layout.pos.col = 1)) # 这里的行是从上直下排列的
print(p1, vp = viewport(layout.pos.row = 3, layout.pos.col = 2:3))
print(p3, vp = viewport(layout.pos.row = 4, layout.pos.col = 1))
print(p4, vp = viewport(layout.pos.row = 4, layout.pos.col = 2))
print(p5, vp = viewport(layout.pos.row = 4, layout.pos.col = 3))
dev.off()
fig 4.5
## 这是我个人认为最好用的多图排版方式,
## 只要算准确各行图片数量的公倍数,就可以随心操作了
## ggdraw()
## 另外还可以用cowplot中的 ggdraw(),但是这个方法稍微麻烦一点
install.packages('cowplot')
library(cowplot)
jpeg(filename="fig4.6.jpeg",width=4000,heigh=4000,units="px",res=600)
ggdraw()+
draw_plot(p1, x = 0, y = .5, width = .5, height = .5) +
draw_plot(p2, x = .5, y = .5, width = .5, height = .5) + # 给出的是各个小图的相对坐标和长宽
draw_plot(p6, x = 0, y = 0, width = 1, height = 0.5) + # 指的注意的是图的相对大小被默认为了 1 x 1
draw_plot_label(label = c("A", "B", "C"), # label 可以不加
x = c(0, 0.5, 0), y = c(1, 1, 0.5)) # 画label的位置
dev.off()
jpeg(filename="fig4.7.jpeg",width=6000,heigh=6000,units="px",res=600)
ggdraw()+
draw_plot(p3, x = 0, y = .7, width = .3, height = .3) +
draw_plot(p4, x = .3, y = .7, width = .3, height = .3) +
draw_plot(p5, x = .6, y = .7, width = .3, height = .3) +
draw_plot(p1, x = 0, y = .35, width = .5, height = .35) +
draw_plot(p2, x = .5, y = .35, width = .5, height = .35) +
draw_plot(p6, x = 0, y = 0, width = 1, height = 0.35)
dev.off()
fig 4.7
## 由于默认的图的大小,使得出的图的分辨率为正方形会好看一些
## 当然,如果你觉得实在是麻烦也可以把图出出来之后在用别的软件P拼在一起
# 4.3 主题和字体
## 自带的主题
theme_bw()
theme_classic()
theme_light()
theme_dark()
theme_gray()
theme_void()
theme_minimal()
ggtech::theme_tech()
## 自定义主题
element_rect(fill,color,size,linetype)
# 背景颜色,边框颜色,大小和线条类型
element_text(family,face, color, size,hjust, vjust,angle,lineheight, margin, debug)
# family 字体
element_line(color,size,linetype,lineend,arrow)
# 在背景中添加一些线条
## 其实这几个功能用不太上,
## 平时用的最多的是字体修改和添加文字
## 添加线条或者别的元素什么的可能在做PCA等一些图的时候会用到,我们到时候讲专题的时候在讲
## 这里给大家看一下自带主题的风格和字体
p1<-
ggplot(iris,aes(Sepal.Length,Sepal.Width,color=Species))+
geom_point()+
ggtitle('p1 默认主题')
ggplot(iris,aes(Sepal.Length,Sepal.Width,color=Species))+
geom_point()+
theme_bw()+
ggtitle('p2 theme_be()')
ggplot(iris,aes(Sepal.Length,Sepal.Width,color=Species))+
geom_point()+
theme_classic()+
ggtitle('p3 theme_classic()')
ggplot(iris,aes(Sepal.Length,Sepal.Width,color=Species))+
geom_point()+
theme_light()+
ggtitle('p3 theme_light()')
ggplot(iris,aes(Sepal.Length,Sepal.Width,color=Species))+
geom_point()+
theme_dark()+
ggtitle('p5 theme_dark()')
ggplot(iris,aes(Sepal.Length,Sepal.Width,color=Species))+
geom_point()+
theme_gray()+
ggtitle('p6 theme_gray()')
ggplot(iris,aes(Sepal.Length,Sepal.Width,color=Species))+
geom_point()+
theme_void()+
ggtitle('p7 theme_void()')
ggplot(iris,aes(Sepal.Length,Sepal.Width,color=Species))+
geom_point()+
theme_minimal()+
ggtitle('p8 theme_minimal()')
jpeg(filename="fig4.8.jpeg",width=4000,heigh=6000,units="px",res=600)
p1+p2+p3+p4+p5+p6+p7+p8+plot_layout(ncol = 2)
dev.off()
fig 4.8
# 4.4 分幅
facet_grid(var.row~var.col,scales,labeller) # 网格图,单变量时 var.row 或 var.col 用点填充
facet_wrap(~var+var,nrow,ncol,scales,labeller) # 将 1d 的面板卷成 2d 网格 (nrow*ncol)
ggforce::facet_zoom(x, y, xy, split = FALSE, zoom.size = 2) #需要ggforce扩展包
# 子集 zoom,x,y,xy 赋值(逻辑值):选取 x 轴,y 轴,xy 交叉子集
## 举例
p1<-
ggplot(mpg, aes(cty, hwy)) +
geom_point()+
facet_grid(year ~ fl)
install.packages('ggforce')
library(ggfroce)
ggplot(iris, aes(Petal.Length, Petal.Width, colour = Species)) +
geom_point() + theme(legend.position="top")+
ggforce::facet_zoom(x = Species == "versicolor")
jpeg(filename="fig4.9.jpeg",width=6000,heigh=4000,units="px",res=600)
dev.off()
jpeg(filename="fig4.10.jpeg",width=6000,heigh=4000,units="px",res=600)
dev.off()
fig 4.9
fig 4.10
# 4.5 标注
ggtitle(label, subtitle) # 图标题,前面代码一直在用
labs(x,y,title,subtitle,caption) # 给坐标轴加标题单位等
xlab(label)/ylab(label) # 等效,这个在前面讲过,这里不细说
notate(“text”,x,y,label, parse) # 文本注释
theme(legend.position = "none"/"bottom"/"top"/"left"/"right") # 图例所在的位置
##举例
p1<-
ggplot(iris, aes(Petal.Length, Petal.Width, colour = Species,shape=Species)) +
geom_point() + theme_classic()+
theme(legend.position="top")+
scale_y_continuous(breaks = c(0.5, 1, 1.5, 2.0, 2.5),
label = c("金", "木", "水","火","土"))+
scale_x_continuous(breaks = c(2,4,6),
label = c("钻石星尘", "神罗天征", "自在极意"))+
labs(y="我瞎写的",x="还是瞎写的")+
theme(text=element_text((family="serif")))+ #修改字体,这里就是新罗马
annotate(geom='text', x=2, y=2.5, label= "中二少年病", parse=FALSE)+