瓷片图绘制教程,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多平台发布

相关推荐
红尘散仙6 小时前
我把终端小说阅读器接上了 AI Agent:TRNovel 现在能用 skill 生成书源了
人工智能·后端·rust
卷毛的技术笔记7 小时前
告别硬编码!Spring AI Alibaba 实现 AI Agent 智能工具调用(Tool Calling)
java·人工智能·后端·python·spring·ai编程
会编程的土豆7 小时前
Go 语言反射(Reflection)详解
开发语言·后端·golang
喵个咪8 小时前
GoWind Toolkit Go后端代码生成 完整全流程实战
后端·go·orm
basketball6168 小时前
Go 语言从入门到进阶:4. 数组和MAP使用方法总结
开发语言·后端·golang
qq_2518364578 小时前
SpringBoot+Vue 共享电池柜管理系统 完整实现 前后端分离项目实战 完整代码
vue.js·spring boot·后端
zhangxingchao9 小时前
AI 大模型核心六:量化、Workflow 与 Agent、多轮 RAG
前端·人工智能·后端
IT_陈寒10 小时前
Vite打包时遇到的坑,原来问题出在这里
前端·人工智能·后端
ayqy贾杰11 小时前
基层管理的三板斧,在AI时代行不通了
前端·后端·团队管理
Apifox11 小时前
Apifox 5 月更新|Postman 导入优化、Runner 支持非 root 运行、请求代码自动带鉴权
前端·后端·安全