【R分享|实战】 跟着科白君学画散点图就对了~

 夯实基础,持之以恒。”   --科白君
"R实战"专题·第1篇
  编辑 | 科白维尼
  5311字 | 9分钟阅读
本文推送内容
利用ggplot2包及相关包描绘美观且有用的散点图。散点图是一种常用的图形,可以直观展示回归分析中数据的分布和聚合情况(因变量随自变量而变化的大致趋势,进而找到变量之间的合适函数关系)。我们经常看到用散点图表示线性回归关系,进行预测分析,进而做出科学的决策。变量之间的关系有很多,如线性关系指数关系对数关系等等,当然,没有关系也是一种重要的关系。
本文将逐步讲解,教大家如何用ggplot2包等绘制让人赏心悦目的散点图,基于R-4.0.2版本。
首先,加载所需R包。
if (!require("pacman")) install.packages ("pacman")  # 下载 pacman 程序包 
library ("pacman") # library 加载 pacman 程序包
p_load (ggplot2, ggthemes, dplyr, readr, showtext, export) # p_load 需要 pacman 包才能运行

然后,我们利用R语言自带的数据集"mpg"

# 选择R语言自带的数据集,<- 为赋值符号
a <- mpg
# 查看数据集前 6 行,tail () 查看尾 6 行 
head (a)
# 如果想看前 10 行的数据,可以改写成 head (a, 10)
# 如果想深入了解该函数用法,可以用 help () 进行访问
# 了解数据结构 
str (a)

结果展示:

最后,利用这份数据,逐步绘制和完善散点图。

3.1 绘制基本的散点图

p1 <- ggplot (data = a,    # ggplot 函数基础下能够画多种多样的图形
   aes (x = hwy, y = displ, colour = class))+  # aes 描绘函数,对载入数据中所要表达的x, y, colour, shape等等
 geom_point ( ) # 画散点图的函数 geom_point ( ) 
p1 # 或者 print (p1)

输出结果:

在这个基础图上,我们如何进行修改和完善?我们画图的目的是让图片的比例、颜色、形状更让人赏心悦目。接下来,我将逐步对散点图主要的元素进行描绘和讲解,以便大家学习和模仿。

3.2 调整点的大小

图中每个散点有点小,不便于大家阅读,将其放大一些。

p2 <- ggplot (data = a, 
 aes (x = hwy, y = displ, colour = class))+
  geom_point (size = 3.5) # size 函数作用是改变大小
p2

输出结果:

3.3 根据不同的分组改变散点图的形状

p3 <- ggplot (data = a,
 aes (x = hwy, y = displ, colour = class, shape = class))+
  geom_point (size = 3.5)+
  scale_shape_manual (values = c (16, 17, 18, 19, 20, 21, 22)) # scale_shape_manual 函数用来自定义对应分组散点的形状,数字表示形状类型
p3

输出结果:

我们发现既对class进行颜色区分,又对其进行形状区分,这样的视觉效果并不好。于是,我们只保留其颜色区分,并选用18号充实菱形形状来描绘。

p4 <- ggplot (data = a,
 aes (x = hwy, y = displ, colour = class))+
  geom_point (size = 5, shape = 18) # 在 geom_point 函数下的 shape 表示所有点都为该形状
p4

结果展示:

其实在用我们自己实验得到的数据时,特别是平行样品较多的时候,很多样点会重叠看不清楚,这里我们可以调节散点的透明度,让重叠的点也变得可读。

3.4 调节散点图的透明度

这里需要用到 geom_point 里的 alpha 函数

p5 <- ggplot (data = a,
  aes (x = hwy, y = displ, colour = class))+
  geom_point (size = 5, shape =18, alpha = 0.5) # alpha 函数作用是调节图形中元素的透明度
p5

结果展示:

3.5 修改x,y轴的刻度范围

图基本调节好了,但发现x,y轴有点参差不齐。x和y轴的刻度不是我们所希望表现的,需要重新设定。这里,需要用到 scale_x/y_continuous 函数。

p6 <- p5+  
  scale_x_continuous (limits = c (10, 45), breaks = seq (10, 45, 5))+ # breaks 函数表示 min,max,刻度间隔
  scale_y_continuous (limits = c (1, 7), breaks = seq (1, 7, 1))  # limits 函数表示 min, max
p6

结果展示:

3.6 设定x,y轴的标签及标题和副标等

这时候我们可以根据自己的需求修改x,y轴的标签名,以及给图片附上标题和副标,让图片更加完整。

p7 <- p6+  
  labs (title = "Changes of soil organic carbon with soil depth",  # labs 函数用来写标签,记得必须添加引号
           subtitle = "Soil organic carbon")+
  labs (x = "soil depth", y = "Soil organic carbon content (g/kg)")
p7

结果展示:

3.7 图例的管理(这期主要讲位置)

图例比较小,单独放在外面不够美观。仔细观察,图例右上角还有一处空白地,咱们就把它移动进去,这样整张图就显得更加饱满了。不过图例具体如何管理还需要根据画出来的图片情况来调整,有时可以将图例放图顶或者图底,因人而异。这里,需要强调,当图例放进图中时,x, y为(0,0)是左下角,(1,1)是右上角。根据自己情况进行调整。

p8 <- p7+
  theme ( legend.position = c (0.8, 0.6)) # theme 函数主要是图片内的主题等 
p8

结果展示:

我们发现得到的图里有一块白色的,不太美观,再用一条图例背景代码。

p9 <- p8+
  theme (legend.background = element_blank ())
p9

得到:

关于图例的其他设置,我会专门找一期来细讲。

3.8 字体设置

可以根据自己喜好调整字体,但是一般投稿的字体类型都用的Arial字体。R语言输出的图片默认的也是Arial字体。
windowsFonts (
  # 中文字体
  lishu = windowsFont (family = "LiSu"), # 隶书
  yahei = windowsFont (family = "Microsoft YaHei"), # 微软雅黑
  xinwei = windowsFont (family = "STXingwei"), # 华文新魏
  kaiti = windowsFont (family = "KaiTi"), # 楷体
  heiti = windowsFont (family = "SimHei"), # 黑体
  # 英文字体
  arial = windowsFont (family = "Arial"), # Arial字体
  newman = windowsFont (family = "Times New Roman"), #Times New Roman字体
  hand = windowsFont (family = "Lucida Calligraphy"), # Lucida手写体
  Helvetica = windowsFont (family = "Helvetica"), # 印刷体 
)

3.9 字体大小和类型

仔细观察,现在得到的图x, y轴的标签以及字体大小都偏小,因此需要进行修改。

p9_1 <- ggplot (data = a,
 aes (x = hwy, y = displ, colour = class))+
  geom_point (size = 5, alpha = 0.5, shape = 18)+
  scale_x_continuous (limits = c (10, 45), breaks = seq (10, 45, 5))+
  scale_y_continuous (limits = c (1, 7), breaks = seq (1, 7, 1))+
  theme (axis.text = element_text (size = 12, colour = "black"), # axis.text/title 表示坐标轴标签的信息
  axis.title = element_text (size =12, colour = "black"), # 坐标轴的颜色默认是灰黑色并不是黑色,这里需要自己改成黑色。
  legend.position = c (0.8, 0.6),
  legend.background = element_blank (),
  legend.text = element_text (size = 12), # 图例信息的大小
  text = element_text (family ="arial"),
  plot.title = element_text (family ="arial", size = 16))+ # family 函数表示字体类型,size 表示大小 
  labs (title = "Changes of soil organic carbon with soil depth",
  subtitle = "Soil organic carbon")+
  labs ( x ="soil depth", y = "Soil organic carbon content (g/kg)")
p9_1

结果展示:

我不太喜欢R语言自带的背景色,通常都选用网格白色底。需要用到theme_bw () 函数。

p9_1 <- ggplot (data = a,
 aes (x = hwy, y = displ, colour = class))+
  geom_point (size = 5, alpha = 0.5, shape = 18)+
  scale_x_continuous (limits = c (10, 45), breaks = seq (10, 45, 5))+
  scale_y_continuous (limits = c (1, 7), breaks = seq (1, 7, 1))+ theme_bw ( )+ 
  theme (axis.text = element_text (size = 12, colour = "black"), # axis.text/title 表示坐标轴标签的信息
  axis.title = element_text (size =12, colour = "black"), # 坐标轴的颜色默认是灰黑色并不是黑色,这里需要自己改成黑色。
  legend.position = c (0.8, 0.6), 
  legend.background = element_blank (),
  legend.text = element_text (size = 12), # 图例信息的大小
  text = element_text (family ="arial"),
  plot.title = element_text (family ="arial", size = 16))+ # family 函数表示字体类型,size 表示大小 
  labs (title = "Changes of soil organic carbon with soil depth",
  subtitle = "Soil organic carbon")+
  labs ( x ="soil depth", y = "Soil organic carbon content (g/kg)") 
p9_1

关于背景主题的题材很多,这一期就不展开讲了。后面找一专题再具体详聊。

4.0 输出图片
这里,我们可以用 ggplot2 包的 ggsave 函数或者 export 包的 graph2ppt 函数。

# export 包下的输出方式
p9_2 <- p9_1+
graph2ppt (file ="outcome.ppt", append = FALSE)

# ggplot2 包下的输出方式
p9_3 <- ggplot (data = a,
 aes (x = hwy, y = displ, colour = class))+
  geom_point (size = 5, alpha = 0.5, shape = 18)+
  scale_x_continuous (limits = c (10, 45), breaks = seq (10, 45, 5))+
  scale_y_continuous (limits = c (1, 7), breaks = seq (1, 7, 1))+ theme_bw ( )+
  theme (axis.text = element_text (size = 12, colour = "black"),  # axis.text/title 表示坐标轴标签的信息
   axis.title = element_text (size = 12, colour = "black"),  # 坐标轴的颜色默认是灰黑色并不是黑色,这里需要自己改成黑色。
   legend.position = c (0.8, 0.6),
   legend.background = element_blank (),
   legend.text = element_text (size = 12), # 图例信息的大小
   plot.title = element_text (size = 16))+ # size 表示大小
  labs (title = "Changes of soil organic carbon with soil depth",
  subtitle = "Soil organic carbon")+
  labs ( x = "soil depth", y ="Soil organic carbon content (g/kg)")
ggsave ("p9_3.pdf") # 由于在输出是出现了无效字体的报错,只能把有关字体的代码删除了再进行输出。

附上完整的代码:

#####################################
# ggplot2 包画散点图的详细讲解与绘制
#####################################

#1 加载所需要的R包
if (!require("pacman")) install.packages ("pacman") # 下载 pacman 程序包
library ("pacman") # library 加载 pacman 程序包
p_load (ggplot2, ggthemes, dplyr, readr, showtext, export) # p_load 需要 pacman 包才能运行

#2 加载数据集
# 选择R语言自带的数据集,<- 为赋值符号
a <- mpg
# 查看数据集前 6 行,tail () 查看尾 6 行
head (a)
# 如果想看前 10 行的数据,可以改写成 head (a, 10)
# 如果想深入了解该函数用法,可以用 help () 进行访问
# 了解数据结构
str (a)

#3 逐步分析讲解散点图
#1) 基础的散点图
p1 <- ggplot (data = a, # ggplot 函数基础下能够画多种多样的图形
  aes (x = hwy, y = displ, colour = class))+ # aes 描绘函数,对载入数据中所要表达的x, y, colour, shape等等
  geom_point ( ) # 画散点图的函数 geom_point ( )
p1 # 或者 print (p1)

#2) 调整点的大小
p2 <- ggplot (data = a,
aes (x = hwy, y = displ, colour = class))+
  geom_point (size = 3.5) # size 函数作用是改变大小
p2

#3) 根据不同的分组改变散点图的形状
p3 <- ggplot (data = a,
  aes (x = hwy, y = displ, colour = class, shape = class))+
  geom_point (size = 3.5)+
  scale_shape_manual (values = c (16, 17, 18, 19, 20, 21, 22)) # scale_shape_manual 函数用来自定义对应分组散点的形状,数字表示形状类型
p3

#4) 只保留其颜色区分,并选用18号充实菱形形状来描绘
p4 <- ggplot (data = a,
  aes (x = hwy, y = displ, colour = class))+
  geom_point (size = 5, shape = 18) # 在 geom_point 函数下的 shape 表示所有点都为该形状
p4

#5) 调节散点图的透明度
p5 <- ggplot (data = a,
  aes (x = hwy, y = displ, colour = class))+
  geom_point (size = 5, shape =18, alpha = 0.5) # alpha 函数作用是调节图形中元素的透明度
p5

#6) 修改x,y轴的刻度范围
p6 <- p5+
  scale_x_continuous (limits = c (10, 45), breaks = seq (10, 45, 5))+ # breaks 函数表示 min,max,刻度间隔
  scale_y_continuous (limits = c (1, 7), breaks = seq (1, 7, 1)) # limits 函数表示 min, max
p6

#7) 设定x,y轴的标签及标题和副标等
p7 <- p6+
  labs (title = "Changes of soil organic carbon with soil depth", # labs 函数用来写标签,记得必须添加引号
  subtitle = "Soil organic carbon")+
  labs (x = "soil depth", y = "Soil organic carbon content (g/kg)")
p7

#8) 图例的管理(这期主要讲位置)
p8 <- p7+
  theme ( legend.position = c (0.8, 0.6)) # theme 函数主要是图片内的主题等
p8
p9 <- p8+
  theme (legend.background = element_blank ())
p9

#9) 字体设置
windowsFonts (
  # 中文字体
  lishu = windowsFont (family = "LiSu"), # 隶书
  yahei = windowsFont (family = "Microsoft YaHei"), # 微软雅黑
  xinwei = windowsFont (family = "STXingwei"), # 华文新魏
  kaiti = windowsFont (family = "KaiTi"), # 楷体
  heiti = windowsFont (family = "SimHei"), # 黑体
  # 英文字体
  arial = windowsFont (family = "Arial"), # Arial字体
  newman = windowsFont (family = "Times New Roman"), #Times New Roman字体
  hand = windowsFont (family = "Lucida Calligraphy"), # Lucida手写体
  Helvetica = windowsFont (family = "Helvetica"), # 印刷体
)

#10) 字体大小和类型
p9_1 <- ggplot (data = a,
 aes (x = hwy, y = displ, colour = class))+
  geom_point (size = 5, alpha = 0.5, shape = 18)+
  scale_x_continuous (limits = c (10, 45), breaks = seq (10, 45, 5))+
  scale_y_continuous (limits = c (1, 7), breaks = seq (1, 7, 1))+
  theme (axis.text = element_text (size = 12, colour = "black"), # axis.text/title 表示坐标轴标签的信息
   axis.title = element_text (size =12, colour = "black"), # 坐标轴的颜色默认是灰黑色并不是黑色,这里需要自己改成黑色。
   legend.position = c (0.8, 0.6),
   legend.background = element_blank (),
   legend.text = element_text (size = 12), # 图例信息的大小
   text = element_text (family ="arial"),
   plot.title = element_text (family ="arial", size = 16))+ # family 函数表示字体类型,size 表示大小
  labs (title = "Changes of soil organic carbon with soil depth",
  subtitle = "Soil organic carbon")+
  labs ( x ="soil depth", y = "Soil organic carbon content (g/kg)")
p9_1

# 更换白色底背景
p9_1 <- ggplot (data = a,
 aes (x = hwy, y = displ, colour = class))+
  geom_point (size = 5, alpha = 0.5, shape = 18)+
  scale_x_continuous (limits = c (10, 45), breaks = seq (10, 45, 5))+
  scale_y_continuous (limits = c (1, 7), breaks = seq (1, 7, 1))+
  theme_bw ( )+
  theme (axis.text = element_text (size = 12, colour = "black"), # axis.text/title 表示坐标轴标签的信息
   axis.title = element_text (size =12, colour = "black"), # 坐标轴的颜色默认是灰黑色并不是黑色,这里需要自己改成黑色。
   legend.position = c (0.8, 0.6),
   legend.background = element_blank (),
   legend.text = element_text (size = 12), # 图例信息的大小
   text = element_text (family ="arial"),
   plot.title = element_text (family ="arial", size = 16))+ # family 函数表示字体类型,size 表示大小
  labs (title = "Changes of soil organic carbon with soil depth",
  subtitle = "Soil organic carbon")+
  labs ( x ="soil depth", y = "Soil organic carbon content (g/kg)")
p9_1

# 输出图片
# export 包
p9_2 <- p9_1+
graph2ppt(file="outcome.ppt",append=FALSE)
# ggplot2 包
p9_3 <- ggplot (data = a,
 aes (x = hwy, y = displ, colour = class))+
  geom_point (size = 5, alpha = 0.5, shape = 18)+
  scale_x_continuous (limits = c (10, 45), breaks = seq (10, 45, 5))+
  scale_y_continuous (limits = c (1, 7), breaks = seq (1, 7, 1))+ theme_bw ( )+
  theme (axis.text = element_text (size = 12, colour = "black"), # axis.text/title 表示坐标轴标签的信息
   axis.title = element_text (size =12, colour = "black"), # 坐标轴的颜色默认是灰黑色并不是黑色,这里需要自己改成黑色。
   legend.position = c (0.8, 0.6),
   legend.background = element_blank (),
   legend.text = element_text (size = 12), # 图例信息的大小
   plot.title = element_text (size = 16))+ # size 表示大小
  labs (title = "Changes of soil organic carbon with soil depth",
  subtitle = "Soil organic carbon")+
  labs ( x ="soil depth", y = "Soil organic carbon content (g/kg)")
ggsave("p9_1.pdf")

最后展示:

Tips:
1)R语言的每行代码也如同PS里的图层一样,如果这行代码放在下一行可能出来的结果就不一样了。例如,theme_bw ( ) 这个代码如果放在最后又是另一个结果。本文推送没有展示,大家可以自己试试。
2)所有不懂的函数,或者需要详细了解的函数,都可以用 help (" ") 进行访问,或者利用 ? " xx "也可以。
3)代码可以直接copy,但是也希望自己多敲敲代码喔,毕竟熟能生巧嘛~
(0)

相关推荐