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

相关推荐
追逐时光者1 小时前
免费、简单、直观的数据库设计工具和 SQL 生成器
后端·mysql
初晴~2 小时前
【Redis分布式锁】高并发场景下秒杀业务的实现思路(集群模式)
java·数据库·redis·分布式·后端·spring·
盖世英雄酱581362 小时前
InnoDB 的页分裂和页合并
数据库·后端
小_太_阳2 小时前
Scala_【2】变量和数据类型
开发语言·后端·scala·intellij-idea
直裾2 小时前
scala借阅图书保存记录(三)
开发语言·后端·scala
星就前端叭3 小时前
【开源】一款基于Vue3 + WebRTC + Node + SRS + FFmpeg搭建的直播间项目
前端·后端·开源·webrtc
小林coding4 小时前
阿里云 Java 后端一面,什么难度?
java·后端·mysql·spring·阿里云
AI理性派思考者4 小时前
【保姆教程】手把手教你在Linux系统搭建早期alpha项目cysic的验证者&证明者
后端·github·gpu
从善若水5 小时前
【2024】Merry Christmas!一起用Rust绘制一颗圣诞树吧
开发语言·后端·rust