瓷片图绘制教程,R语言ggplot2绘图笔记

瓷片图像地板砖一样,由许多个小格子组成,不用的颜色深浅可以用来表示不同的值,横轴和纵轴可以用来展示不同的位置,二维码图、马赛克图、热图等都有异曲同工之妙。

今天分享一个在R语言中利用ggplot2包绘制瓷片图的方法,支持不同分组不同类型等数据合并展示,轻松完成可视化。


在R语言中,geom_tile() 是 ggplot2 包中的一个函数,用于创建瓷砖图,也常被用来制作热图。

这种类型的图表非常适合展示二维数据的矩阵,其中每个瓷砖的颜色可以表示矩阵中对应元素的值。

功能和作用

  • 展示二维数据的分布特征
  • 制作简易热图
  • 多组数据之间相互比较

绘图流程

复制代码
library(ggplot2)

data <- data.frame(
    Group=c(rep(paste0("G",1:3),100)),
    Class=c(rep(paste0("Class ",1:6),each=50)),
    Pos=c(rep(1:16,each=3),17,18),
    value=runif(300,1,10),
    addtion=1:300
)

下面是代码中每一行的简单解释(右滑查看):
Group=c(rep(paste0("G",1:3),100)): 这一行创建了一个名为 Group 的列。它首先使用 paste0("G", 1:3) 生成字符串 "G1", "G2", 和 "G3"。然后,rep() 函数重复这三个值100次,结果是一个长度为300的向量,每个字符串重复出现100次。
Class=c(rep(paste0("Class ",1:6),each=50)): 这一行创建了一个名为 Class 的列。它生成了六个字符串:"Class 1" 到 "Class 6"。rep(..., each=50) 确保每个字符串重复50次,形成一个长度为300的向量。
Pos=c(rep(1:16,each=3),17,18): 这里创建了一个名为 Pos 的列。rep(1:16, each=3) 表示数字1到16每个重复3次,接着在这个序列的末尾添加了17和18。这将产生一个长度为50(16x3+2)的向量,然后整个向量重复六次(因为 Class 列有6个类别,每个类别50个条目),形成一个长度为300的向量。
value=runif(300,1,10): 这行创建了一个名为 value 的列,包含300个在1到10之间均匀分布的随机数。
addtion=1:300: 最后,这行创建了一个名为 addtion 的列,简单地包含从1到300的整数。

通过以上代码生成一个随机测试数据框,其中包含了分组、分类、位置、值等信息,格式预览如下:

基础框架图

根据上述的数据,先使用两行代码实现最基础的瓷片图:

复制代码
ggplot(data)+
    geom_tile(aes(x=Pos,y=Group,fill=value))

分面展示图

上图仅展示了一个分组的数据,如果想将不同Class的数据也一起画出来,则需要借助分面功能:

复制代码
plot <- ggplot(data, aes(x = Pos, y = Group)) + 
    geom_tile(aes(fill = value), colour = "white") +
    scale_fill_gradient(low="white", high="#22a6b3")+ 
    facet_wrap(~ Class, ncol = 1)+
    theme_bw()
plot

此时经过分面后不同Class的数据分开呈现于不同子图,同时修改了颜色的映射值,明显好看一点儿了,但是如果分成一列看起来不协调,使用ncol参数修改为两列,同时在每个色块儿上添加具体的数值,方便查看,效果如下:

修饰结果图

复制代码
plot <- ggplot(data, aes(x = Pos, y = Group)) +
    geom_tile(aes(fill = value), colour = "white") +
    scale_fill_gradient(low="white", high="#22a6b3") +
    facet_wrap(~ Class, ncol = 2, scales = "free") +
    scale_x_continuous(breaks = seq(0,60,2),expand = c(0, 0))+
    geom_text(aes(label=str_sub(value,1,1)),color='#f1f2f6') +
    theme_classic()+
    theme(
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        strip.background = element_rect(fill = "#ffffff"),
        strip.text = element_text(size = 12, face = "bold"),
        axis.text = element_text(size = 12, color = "black"),
        axis.title = element_text(size = 14, face = "bold"),
        legend.position = "right",
        legend.title = element_text(size = 12),
        legend.text = element_text(size = 10)
    )
plot

增加一些主题美化代码,即可获得如下结果图,数据是随机生成的,没有实际含义,仅提供绘图思路和方法,请您根据实际需要进行修改。

补充知识点

本文中使用的ggplot2绘图系统,主要涉及以下几个关键函数,下面做一些简单是补充说明。

geom_tile

根据tile单词的翻译就能明白,这个函数的功能就是创建瓷片图,也就是色块,本质上是根据数据计算元素的位置和填充颜色,这也是一个非常基础的功能。

scale_fill_gradient

这个函数用于为图表中的元素(如瓷砖图、条形图、箱线图等)设置渐变色填充。 主要用于那些通过颜色表示数值大小的图表,比如热图或某些类型的散点图。

通过指定两种颜色,scale_fill_gradient() 可以创建一个从一种颜色渐变到另一种颜色的效果,这通常用来表示数值数据的范围。

复制代码
scale_fill_gradient(low = "blue", high = "red")

如果你不喜欢配色,改颜色就用它。

facet_wrap

分面是一个神奇的功能,这个函数用于创建分面(facet)图。分面图是一种数据可视化技术,它允许你将一个大的图表拆分成几个小图表(称为分面),每个小图表展示数据的一个子集。

facet_wrap() 特别适用于当你有一个或多个分类变量,并希望对每个类别单独展示同一图表,以下是一个使用方法示例:

复制代码
ggplot(data, aes(x = x_variable, y = y_variable)) +
  geom_point() +
  facet_wrap(~ facet_variable, 
  nrow = number_of_rows, 
  ncol = number_of_columns
)

facet_wrap() 是一个非常强大的工具,用于在相同的页面或视图中比较和展示多个数据子集的图表。通过使每个子集的图表保持一致的样式和比例,极大地促进了不同子集之间的直观比较。

本文由mdnice多平台发布

相关推荐
uzong16 分钟前
技术故障复盘模版
后端
GetcharZp44 分钟前
基于 Dify + 通义千问的多模态大模型 搭建发票识别 Agent
后端·llm·agent
桦说编程1 小时前
Java 中如何创建不可变类型
java·后端·函数式编程
IT毕设实战小研1 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
wyiyiyi2 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
阿华的代码王国3 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
Jimmy3 小时前
AI 代理是什么,其有助于我们实现更智能编程
前端·后端·ai编程
AntBlack3 小时前
不当韭菜V1.1 :增强能力 ,辅助构建自己的交易规则
后端·python·pyqt
bobz9654 小时前
pip install 已经不再安全
后端
寻月隐君4 小时前
硬核实战:从零到一,用 Rust 和 Axum 构建高性能聊天服务后端
后端·rust·github