R包Programing Language

R语言编程-Tidyverse 书籍 - 第三章 - ggplo

2022-10-12  本文已影响0人  Hello育种

R最强项就是可视化,而ggplot2是其中最为著名的包

3.1 ggplot2基本语法

ggplot2 基于图层化语法:图形是一层一层的图层叠加而成。
选取整洁数据将其映射为几何对象(如点、线等) ,几何对象具有美学特征(如坐标轴、颜色等) ,若需要则对数据做统计变换,调整标度,将结果投影到坐标系,再根据喜好选择主题。

绘图流程

image.png

包括10个部件, 前3个是必须得, 其他ggplot2会自动帮你设置。

基本模板

ggplot(data = ,
           mapping = aes()) +
        geom_function(mappong = aes(),
           stat = ,
           position = )+ 
      <SCALE_FUNCTION> +
      <COORDINATE_FUNCTION> +
      <FACET_FUNCTION> +
      <THEME_FUNCTION>

数据、映射、几何对象

ggplot(data = mpg, mapping = aes(x = displ, y = hwy, color = drv))
经常将图形的美学color, size 等映射到数据集的分类变量,以实现不同分组用不同的美学来区分. 。所以,若要为美学指定特定值,比如color = "red", 是不能放在映射
aes() 中的。

ggplot() 中的数据和映射,是全局的,可供所有几何对象共用;位于’’ 几何对象’’ 中的数据和映射,是局部的,只供该几何对象使用;

‘‘几何对象’’ 优先使用局部的,局部没有则用全局的。

分组使用group

scales 包提供了很多现成的设置刻度标签风格的函数

1. 修改坐标轴刻度及标签

1.1 用scale_*_continuous() 修改连续变量坐标轴的刻度和标签:

用scale_*_discrete() 修改离散变量坐标轴的标签:
1.2 scale_x_discrete(labels = c("4" = " 四驱", "f" = " 前驱", "r" = " 后驱"))

1.3 用scale_x_date() 设置日期刻度,参数date_breaks 设置刻度间隔,date_labels 设置标签的日期格式;
1.4 借助scales 包中的函数设置特殊格式,比如百分数(percent)、科学计数法(scientific)、美元格式(dollar) 等。

2. 修改坐标轴标签、图例名及图例位置

函数xlab(), ylab(), 设置x 轴、y 轴标签
前面已使用color 美学,则可以在labs() 函数中使用参数color 修改颜色的图例名.

图例位置是在theme 图层通过参数legend. position 设置,可选取值有“none,” “left,” “right,” “bottom,” “top.”

3. 设置坐标轴范围

xlim(), ylim() 函数,设置x 轴和y 轴的范围

4.变换坐标轴

ggplot2 提供的坐标变换函数scale_x_log10() 等是变换坐标系,能够在视觉效果相同的情况下,使用原始数据的坐标刻度

5.设置图形标题

用labs() 函数的参数title, subtitle, caption 设置标题、副标题、脚注标题(默认右下角)

如果想改成顶部居中,需要加theme 图层专门设置


image.png

6. 设置fill, color 颜色

数据的某个维度信息可以通过颜色来展示,颜色直接影响图形的美感。
可以直接使用颜色值,但是更建议使用RColorBrewer(调色板)或colorspace 包。
6.1 离散变量


image.png

6.2 连续变量


image.png
image.png

7. 添加文字标注-ggrepel 包

ggrepel 包提供了geom_label_repel() 和geom_text_repel() 函数,为图形添加文字标注。
首先要准备好标记点的数据,然后增加文字标注的图层,需要提供标记点数据,以及要标注的文字给label 美学,若来自数据变量,则需要用映射

library(ggrepel)
best_in_class = mpg %>% # 选取每种车型hwy 值最大的样本
   group_by(class) %>%
   slice_max(hwy, n = 1)
ggplot(mpg, aes(displ, hwy)) +
  geom_point(aes(color = class)) +
  geom_label_repel(data = best_in_class, aes(label = model))
image.png

若要在图形某坐标位置添加文本注释,则用annotate() 函数,需要提供添加文本的中心坐标位

4 统计变换、坐标系、位置调整

ggplot2 中的提供了30 多种‘‘统计’’,均以stat_xxxx() 的方式命名。可以分为两类:

image.png image.png

例子:
用stat_summary() 做统计汇总并绘图。通过传递函数做统计计算,首先注意x 和y 美学映射到calss 和hwy; fun = mean 是根据x 计算y,故对每个车型计算一个平均的hwy;fun.max, fun.min 同样根据x 分别计算y 的均值加减标准差;统计计算的结果将传递给几何对象参数geom 用于绘图:

ggplot(mpg, aes(x = class, y = hwy)) +
   geom_violin(trim = FALSE, alpha = 0.5, color = "green") + # 小提琴图
   stat_summary(fun = mean,
                           fun.min = function(x) {mean(x) - sd(x)},
                           fun.max = function(x) {mean(x) + sd(x)},
                           geom = "pointrange", color = "red")
image.png

用stat_smooth(), 与geom_smooth() 相同, 添加光滑曲线:

ggplot(mpg, aes(displ, hwy)) +
           geom_point() +
         stat_smooth(method = "lm",
                              formula = y ~ splines::bs(x, 3),
                             se = FALSE) # 不绘制置信区间
image.png

坐标系(Coordinante)

ggplot2 默认坐标系是直角坐标系coord_cartesian(),常用的坐标系操作还有:


image.png

坐标轴翻转,从水平图到竖直图:

ggplot(mpg, aes(class, hwy)) +
         geom_boxplot() + # 箱线图
         coord_flip() # 从竖直变成水平
image.png

直角坐标下的条形图,转化为极坐标下的风玫瑰图:

ggplot(mpg, aes(class, fill = drv)) +
     geom_bar() +
     coord_polar()
image.png

位置调整(Position adjustments)

(1) 条形图中的条形位置调整:
position_stack(): 竖直堆叠
position_fill(): 竖直(百分比) 堆叠,按比例放缩保证总高度为1
position_dodge(), position_dodge2(): 水平堆叠##使用更多

ggplot(mpg, aes(class, fill = drv)) +
   geom_bar(position = position_dodge(preserve = "single"))
image.png

(2) 散点图中的散点位置调整:

有时候需要将多个图形排布在画板中,借助patchwork 包更方便。

library(patchwork)
p1 = ggplot(mpg, aes(displ, hwy)) +
   geom_point()
p2 = ggplot(mpg, aes(drv, displ)) +
   geom_boxplot()
p3 = ggplot(mpg, aes(drv)) +
   geom_bar()
p1 | (p2 / p3)
image.png

分面、主题、输出

ggplot(mpg, aes(displ, hwy)) +
   geom_point() +
   facet_wrap(~ drv, scales = "free")
image.png
ggplot(mpg, aes(displ, hwy)) +
   geom_point() +
   facet_wrap(~ drv + cyl)
image.png

(2) facet_grid(): 网格分面,生成二维的面板网格,面板的行与列通过分面变量定义。

ggplot(mpg, aes(displ, hwy)) +
   geom_point() +
   facet_grid(drv ~ cyl)
image.png

使用或修改主题,只需要添加主题图层:

ggplot(mpg, aes(displ, hwy, color = drv)) +
   geom_point() +
   theme_bw()
image.png

更多的主题,还可以用ggthemes 包,其中包含一些顶级期刊专用绘图主题;当然也可以用theme()函数定制自己的主题(略)。

ggplot2 图形示例

Nathan Yau 将数据可视化的过程总结为如下的4 个思索:

一般的6类:

类别比较图、数据关系图、数据分布图、时间序列图、局部整体图、地理空间图

ggpubr 包提供了很多函数,轻松绘制适合用于期刊论文发表的图形

(1)类别比较图:类别比较图,通常是展示和比较分类变量或分类变量组合的频数


image.png

热图:邻接矩阵、混淆矩阵、相关系数矩阵也可以用热图来可视化展示
ComplexHeatmap 包可绘制更复杂的热图:带层次聚类的热图。

(2)数据关系图
主要包括:

library(visNetwork)
visNetwork(nodes, edges)
image.png

(3) 数据分布图:主要展示数据中数值出现的频率或分布规律,比如直方图、概率密度图、箱线图等


image.png

(4)时间序列图:展示数据随时间的变化规律或者趋势。比如,括折线图、面积图等。


image.png

折线图与面积图:用geom_line() 与geom_area()绘制
(5)局部整体图:,展示部分与整体的关系。比如,饼图、树状图等


image.png

(6)地理空间图:是在地图上展示数据关系,即与地理位置信息联系起来绘图。地理位置通常是用经度、纬度表示。


image.png

sf 包实现了将简单要素表示为R 中的data.frame, 以及一系列处理此类数据的工具。
sf 格式数据框中,属性要素是正常的列,几何要素(geometry) 存放为列表列。

(7)动态交互图-ggplotly 包

只要对ggplot2 绘制的图形对象套一个ggplotly() 函数,则图形变成可交互状态:当鼠标移动到图形元素上时,将自动显示对应的数值。

library(plotly)
p = gapminder %>%
    filter(year == 2007) %>%
    ggplot(aes(gdpPercap, lifeExp, size = pop, color = continent)) +
   geom_point() +
   theme_bw()
ggplotly(p)

gganimate 包是基于ggplot2 的动态可视化拓展包,让图形元素随时间等逐帧变化起来,可导出为.gif 动图。

library(gganimate)
ggplot(gapminder, aes(gdpPercap, lifeExp, size = pop)) +
    geom_point() +
    geom_point(aes(color = continent)) +
    scale_x_log10() +
   labs(title = " 年份: {frame_time}", x = " 人均GDP", y = " 预期寿命") +
   transition_time(year)
anim_save("output/gapminder.gif") # 保存为gif 文件
上一篇 下一篇

猜你喜欢

热点阅读