Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >R可视乎|马赛克图

R可视乎|马赛克图

作者头像
庄闪闪
发布于 2021-04-09 02:56:35
发布于 2021-04-09 02:56:35
1.7K00
代码可运行
举报
运行总次数:0
代码可运行

1.前言

马赛克图(mosaic plot),显示分类数据中一对变量之间的关系,原理类似双向的100%堆叠式条形图,但其中所有条形在数值/标尺轴上具有相等长度,并会被划分成段。可以通过这两个变量来检测类别与其子类别之间的关系。

主要优点

马赛克图能按行或按列展示多个类别的比较关系。

主要缺点

难以阅读,特别是当含有大量分段的时候。此外,我们也很难准确地对每个分段进行比较,因为它们并非沿着共同基线排列在一起。

适用

马赛克图比较适合提供数据概览。

注意

非坐标轴非均匀的马赛克图也是统计学领域标准的马赛克图,一个非均匀的马赛克图包含以下构成元素:①非均匀的分类坐标轴;②面积、颜色均有含义的矩形块;③图例。对于非均匀的马赛克图,关注的数据维度非常多,一般的用户很难直观理解,在多数情况下可以被拆解成多个不同的图表,以下我们会对其进行绘制。

2.数据介绍

数据构建代码来源《R数据可视化之美》,任意拟定一个数据框。并用melt()函数将数据转化成以下结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
library(ggplot2)
library(RColorBrewer)
library(reshape2)  #提供melt()函数
library(plyr)      #提供ddply()函数,join()函数

df <- data.frame(segment = c("A", "B", "C","D"),
                      Alpha = c(2400	,1200,	600	,250),
                      Beta = c(1000	,900,	600,	250),
                      Gamma = c(400,	600	,400,	250),
                      Delta = c(200,	300	,400,	250))

melt_df<-melt(df,id="segment")

计算出每行的最大,最小值,并计算每行各数的百分比。ddply()对data.frame分组计算,并利用join()函数进行两个表格连接。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
segpct<-rowSums(df[,2:ncol(df)])
for (i in 1:nrow(df)){
  for (j in 2:ncol(df)){
    df[i,j]<-df[i,j]/segpct[i]*100  #将数字转换成百分比
  }
}

segpct<-segpct/sum(segpct)*100
df$xmax <- cumsum(segpct)
df$xmin <- (df$xmax - segpct)

dfm <- melt(df, id = c("segment", "xmin", "xmax"),value.name="percentage")
colnames(dfm)[ncol(dfm)]<-"percentage"

#ddply()函数使用自定义统计函数,对data.frame分组计算
dfm1 <- ddply(dfm, .(segment), transform, ymax = cumsum(percentage))
dfm1 <- ddply(dfm1, .(segment), transform,ymin = ymax - percentage)
dfm1$xtext <- with(dfm1, xmin + (xmax - xmin)/2)
dfm1$ytext <- with(dfm1, ymin + (ymax - ymin)/2)

#join()函数,连接两个表格data.frame
dfm2<-join(melt_df, dfm1, by = c("segment", "variable"), type = "left", match = "all")

2.方法

绘制马赛克图可以使用ggplot2包的geom_rect()函数、graphics包的mosaicplot()函数,或者vcd包的mosaic()函数绘制马赛克图。接下来对他们进行一一实现。

2.1 ggplot2包的geom_rect()函数

这个方法比较复杂,图层一层一层叠加得到的,不过灵活性比较强,可根据自己喜好进行修改。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ggplot()+
  geom_rect(aes(ymin = ymin, ymax = ymax, xmin = xmin, xmax = xmax, fill = variable),dfm2,colour = "black") +
  geom_text(aes(x = xtext, y = ytext,  label = value),dfm2 ,size = 4)+
  geom_text(aes(x = xtext, y = 103, label = paste("Seg ", segment)),dfm2 ,size = 4)+
  geom_text(aes(x = 102, y = seq(12.5,100,25), label = c("Alpha","Beta","Gamma","Delta")), size = 4,hjust = 0)+
  scale_x_continuous(breaks=seq(0,100,25),limits=c(0,110))+
  theme(panel.background=element_rect(fill="white",colour=NA),
        panel.grid.major = element_line(colour = "grey60",size=.25,linetype ="dotted" ),
        panel.grid.minor = element_line(colour = "grey60",size=.25,linetype ="dotted" ),
        text=element_text(size=15),
        legend.position="none")

图形解释:这个马赛克图,从A这列纵向看可以看出各个指标(Delta,Gamma等)的占比情况,从横向来看,不同变量(A,B等)的宽度代表该变量占所有数据的占比情况,越宽说明该变量数据总和越大。

2.2 vcd包的mosaic()函数

用该函数,我们就不用前面那么复杂的数据集进行绘制了,只要使用xtabs转换成以下数据格式即可,方便简单。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
library(vcd)
table<-xtabs(value ~variable+segment, melt_df)
mosaic( ~segment+variable,table,shade=TRUE,legend=TRUE,color=TRUE)

2.3 graphics包的mosaicplot()函数

该方法和上面类似,掉包就行,数据类型与上面相同。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
library(graphics)
library(wesanderson) #颜色提取
mosaicplot( ~segment+variable,table, color = wes_palette("GrandBudapest1"),main = '')

参考

  1. 《R数据可视化之美》
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 庄闪闪的R语言手册 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
局部整体图表(一)
上一篇文章结束了时间序列型图表的绘制,我们掌握了以下的绘制方法(滑动以浏览),对以往的工作做个总结。目的就是简化大家代码的书写过程,拓宽绘图方法,为科研和商业绘图提供帮助。:
python数据可视化之路
2023/02/23
6610
局部整体图表(一)
ggplot2绘制阴影条带哑铃图
R语言数据分析指南
2024/01/17
1620
ggplot2绘制阴影条带哑铃图
ggplot2高阶案例应用——中国家庭金融资产配置变化
今天浏览新闻,看到一个关于美国居民家庭金融资产配置的调查,主要介绍1974年~2016年美国居民和非居民部门家庭金融资产配置比例分布演变的数据。 数据显示,在所统计的现金和活期存款、定期存款、养老基
数据小磨坊
2018/04/11
6310
ggplot2高阶案例应用——中国家庭金融资产配置变化
R语言ggplot2环形图小例子
https://www.r-graph-gallery.com/128-ring-or-donut-plot.html
用户7010445
2020/03/03
4.5K0
R可视乎|圆环图
对于饼图,上一次学习《R语言数据可视化之美》的时候主要利用graphics包和ggplot包(可见R可视乎|饼图)。这几天的学习中发现还有一个更加简便的方法——ggpie包。接下来做简单描述,然后进入圆环图的学习。
庄闪闪
2021/04/09
2.6K0
🤒 geomtextpath | 成功让你的ggplot注释拥有傲人曲线!~
1写在前面 最近的世界杯结果的确是让人大跌眼镜🕶️, 日本队🇯🇵先后击败世界杯冠军, 德国队🇩🇪和西班牙队🇪🇸, 韩国队🇰🇷逆转葡萄牙🇵🇹, 踩着乌拉圭🇺🇾进入淘汰赛(请韩国队🇰🇷自觉感谢裁判), 让无数人站上天台😂. 不过大家要是看看这几十年日本足球⚽️的发展也就不会觉得奇怪了, 就算有一天日本队将梦想照进现实,捧起大力神杯🏆, 我也不觉得有什么奇怪的. 还是祝各亚洲球队取得好成绩, 也祝梅西和C罗在顶峰相遇, 人生不留遗憾😘. ---- 接着是这一期的教程, 最近用了一下geomtextpath, 是个
生信漫卷
2023/02/24
3870
🤒 geomtextpath | 成功让你的ggplot注释拥有傲人曲线!~
🤩 Circular lollipop | 哇咔咔!!!环形棒棒糖图好吃又好玩!~
由于时间单位不统一,这里我们转化一下,把单位都统一起来,都转成seconds。🥳
生信漫卷
2023/09/04
2290
🤩 Circular lollipop | 哇咔咔!!!环形棒棒糖图好吃又好玩!~
ggplot2-annotation|画图点“精”,让图自己“解释”
可视化的展示方式可以使数据更易读,且容易看出一些数据下隐藏的“结果”,而添加注释则可以进一步聚焦到想重点展示的“信息”。
生信补给站
2020/08/05
6.8K0
ggplot2-annotation|画图点“精”,让图自己“解释”
跟着Nature Communications学作图:R语言ggplot2气泡图组合水平柱形图完整示例
https://www.nature.com/articles/s41467-022-31724-3
用户7010445
2023/01/06
6510
跟着Nature Communications学作图:R语言ggplot2气泡图组合水平柱形图完整示例
87-R可视化19-利用其他图层映射自由的控制背景的颜色
有的小朋友可能会说,这不就是个背景吗?在[[57-R可视化6-ggplot2三部曲最终之进阶为菜鸟]] 中我也提到过主题中的panel.background 参数,比如下图:
北野茶缸子
2022/02/08
4910
87-R可视化19-利用其他图层映射自由的控制背景的颜色
商务图表案例——仿经济学人分组漏斗图~
今天看到一个看着挺养眼的经济学人图表案例,于是职业病爆发了,用ggplot2按照自己的思路写了一遍。现在把代码思路分享给大家! 加载包: library("ggplot2") library("tid
数据小磨坊
2018/04/11
1.5K0
商务图表案例——仿经济学人分组漏斗图~
快来给这个图表起个名字吧~
我一直觉得,一门语言的学习一定要打牢基础,只有基础足够牢固,后期你无论选择哪个方向才会走的一路顺风。 这是我学习R语言将近一年的深刻体会,当初自己也经历过各种急功近利、自我陶醉的状态,当时没有任何人引导,也没怎么正儿八经的学过一门体系健全的教程,硬生生的一直刷题,就这么一路撑过来来了,也算是勉强越过了第一个瓶颈期,但是过程真的太辛苦。 近来有很多人跟我咨询如何学习R语言,其实个人觉得,在他们心里肯定早就有了答案,只是自己不愿意面对,或者总想从过来人的口中得到一丝安慰而已。 要么用时间去换技能,要么花钱买时间
数据小磨坊
2018/04/11
7430
快来给这个图表起个名字吧~
跟着Genome Biology学作图:R语言ggplot2+ggforce画桑基图
https://genomebiology.biomedcentral.com/articles/10.1186/s13059-022-02742-7
用户7010445
2023/01/06
1.6K0
跟着Genome Biology学作图:R语言ggplot2+ggforce画桑基图
跟着Nature Genetics 学画图:R语言ggplot2画基因结构示意图
今天试着重复的图片对应着的是论文附件中的Figure8c,基因结构图,论文中文字部分对图的描述是 Gene structure of Lsat_6X11620. Closed bars represent exons, and open bars represent untranslated regions and introns. The positions of the SNPs in the promoter region are indicated by black triangles. An highly associated SNP, A-to-G transition at Chr. 6:15,542,968 is represented by a red triangle.
用户7010445
2021/05/08
1.8K0
跟着Nature Genetics 学画图:R语言ggplot2画基因结构示意图
R语言聚类树图小例子
将层级聚类的结果转化为ggdendro作图需要的格式,用到的函数是dendro_data(hc,type="rectangle") type有两个参数可选
用户7010445
2020/03/03
1.1K0
ggplot2带你轻松绘制旭日图
R语言数据分析指南
2023/08/18
9864
ggplot2带你轻松绘制旭日图
ggplot2(r包)绘制基因棒棒糖图
使用geom_segment添加棒棒图的棒子,geom_point添加棒棒图上面的圈圈,geom_text_repel添加对应的文字
生信技能树
2025/02/05
1050
ggplot2(r包)绘制基因棒棒糖图
79-R可视化15-ggplot画染色体坐标图
这里为了美观,不继续用ggthemes::theme_economist() 主题:
北野茶缸子
2022/01/04
1.3K0
79-R可视化15-ggplot画染色体坐标图
ggplot2优雅绘制多彩折线图
R语言数据分析指南
2023/08/18
2830
ggplot2优雅绘制多彩折线图
ggplot2优雅的绘制流程图
「代码链接」https://gist.github.com/AlbertRapp/438102c458fc8fbdffcb6feb76ff93f7 可以从网站直接获取,如果你下载网速很慢,可以从文末直接获取
R语言数据分析指南
2022/09/21
5900
ggplot2优雅的绘制流程图
相关推荐
局部整体图表(一)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验