前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何使用 ggplot2 绘制双轴分离图?

如何使用 ggplot2 绘制双轴分离图?

作者头像
庄闪闪
发布于 2022-02-16 13:15:41
发布于 2022-02-16 13:15:41
1.9K00
代码可运行
举报
运行总次数:0
代码可运行

本篇代码及思路由读者大肚子飞行员提供,由闪闪写作和排版整理。

简介

最近科研绘图中,需要解决这么一个需求。如何将下图中的左图(低配版)转化为右图(高配版, x,y 轴分离)。

低配版条形图

首先,构造一个数据集作为样例,读者可以根据自己的数据进行调整即可。假设 y 是分类变量,x 是连续型变量。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df1 <- data.frame(
  term = paste0('term', 1:4),
  p.val = runif(4, 1, 5)
)

样例数据集

之后,使用 geom_col() 绘制条形图,简单调整柱子的宽度以及加上 x,y 轴标题。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ggplot(df1, aes(p.val, term)) +
  geom_col(width = 0.6) +
  labs(x = '-log(BH p value)', 
       y = 'Terms')

低配版条形图

高配版条形图

使用 geom_rangeframe()将 x,y 轴分离。在此之前,创建一个新的数据框,根据你的 x 值,手动划分 x 轴尺度范围。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df2 <- data.frame(x = c(0,2,4,6), y = df1$term)

然后进行一些细节的调整,得到下面的图形。这里的细节调整包括:使用 ggthemes 包中的 theme_tufte() 主题,viridis 包的 scale_fill_viridis() 离散配色。填充的 legend 没有实际含义,所以将图例去除(legend.position = 'none')。

注意:这里将柱子按照类别进行填充,当然你也可以使用另一个变量进行填充(下面会给例子)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ggplot(df1, aes(p.val, term)) +
  geom_col(aes(fill = term), width = 0.6) +
  geom_rangeframe(data = df2, aes(x = x, y = y), sides = 'bl') +
  scale_fill_viridis(discrete = T)+
  theme_tufte() +
  theme(
    legend.position = 'none',
    panel.grid = element_blank(),
    axis.text = element_text(size = rel(1.1))
  ) +
  labs(x = '-log(BH p value)', 
       y = 'Terms')

高配版条形图

进阶版条形图

如前面所说,如果读者还想表达另一个变量与这两个变量之间的关系。可以在柱子的填充上加上做文章。假设第三变量为各个 Term 的得分系数 score(连续型变量)。那么对上面的代码进行简单调整,即可得到以下图形。

主要细节调整:geom_col() 中的 aes(fill = score),连续性变量填充使用 scale_fill_gradient2() 以及加上了图例。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df1 <- data.frame(
  term = paste0('term', 1:8),
  p.val = runif(8, 1, 5),
  score = rnorm(8, 0, 1)
)
df2 <- data.frame(x = c(0:6,6), y = df1$term)

ggplot(df1, aes(p.val, term)) +
  geom_col(aes(fill = score), width = 0.6) +
  geom_rangeframe(data = df2, aes(x = x, y = y), sides = 'bl') +
  scale_fill_gradient2(
    low = 'cyan',
    mid = '#fbffff',
    high = 'chocolate1',
    midpoint = 0)+
  theme_tufte() +
  theme(
    legend.position = c(0.9,0.75),
    panel.grid = element_blank(),
    axis.text = element_text(size = rel(1.1))
  ) +
  labs(x = '-log(BH p value)', 
       y = 'Terms')

进阶版条形图

小编有话说

  • 本推文最主要知识点:使用 geom_rangeframe()并配合 ggthemes 包中的 theme_tufte() 主题,得到 x,y 轴分离的图形。
  • 推文以条形图作为例子进行详细讲解(试图教会你们😄)。当然这种技巧也可以使用其他图形中。读者如有需求,可以自行探索。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-18,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
Elasticsearch 动态映射——自动检测
ES中有一个非常重要的特性——动态映射,即索引文档前不需要创建索引、类型等信息,在索引的同时会自动完成索引、类型、映射的创建。 那么什么是映射呢?映射就是描述字段的类型、如何进行分析、如何进行索引等内容。 本篇就着重讲述下,ES中映射的自动检测特性。 更多内容参考:Elastisearch知识总结 字段自动检测 在某个字段第一次出现时,如果之前没有定义过映射,ES会自动检测它可能满足的类型,然后创建对应的映射。 JSON数据 ES中的数据类型 null 不会添加字段
用户1154259
2018/01/17
8770
Elasticsearch 动态映射——自动检测
5.Elasticsearch动态映射的使用
ES可以自动检测新字段并根据数据自动添加到映射中。这是动态映射的一个强大特性,可以简化索引管理。但是,动态映射可能导致字段类型不一致和性能问题。因此,在生产环境中,最好在索引创建之前明确定义映射。
AI码师
2023/08/18
2810
5.Elasticsearch动态映射的使用
Elasticsearch从入门到放弃:瞎说Mapping
前面我们聊了 Elasticsearch 的索引、搜索和分词器,今天再来聊另一个基础内容—— Mapping。
Jackeyzhe
2020/08/05
9660
Elasticsearch Dynamic Mapping(动态映射机制)
执行上述请求时,索引"data"不必预先创建,该API首先会自动创建索引data、类型映射_doc,其映射类型下包含字段count,其类型为long。自动根据文档的值推测其类型的过程,就是本文要重点描述的机制:动态类型映射机制。动态映射机制包含如下两种映射规则:
丁威
2019/06/10
3.1K0
ElasticSearch最全详细使用教程:入门、索引管理、映射详解
墨墨导读:本文介绍了ElasticSearch的必备知识:从入门、索引管理到映射详解。
数据和云
2019/08/12
3.2K0
ElasticSearch最全详细使用教程:入门、索引管理、映射详解
ES[7.6.x]学习笔记(五)动态映射
通常情况下,我们使用ES建立索引的步骤是,先创建索引,然后定义索引中的字段以及映射的类型,然后再向索引中导入数据。而动态映射是ES中一个非常重要的概念,你可以直接向文档中导入一条数据,与此同时,索引、字段、字段类型都会自动创建,无需你做其他的操作。这就是动态映射的神奇之处。
小忽悠
2020/04/30
5750
ES[7.6.x]学习笔记(五)动态映射
Elasticsearch 学习笔记
es提供了一个测试分词的 api 接口,方便验证分词效果,endpoint 是 _analyze
学徒漠筱歌
2022/07/17
6220
Elasticsearch 6.x Mapping设置
需要注意的是,在索引中定义太多字段可能会导致索引膨胀,出现内存不足和难以恢复的情况,下面有几个设置:
小旋锋
2019/01/21
3.2K0
干货 | Elasticsearch5.X Mapping万能模板
0、引言 在关系型数据库如Mysql中,设计库表需要注意的是: 1)需要几个表; 2)每个表有哪些字段; 3)表的主键及外键的设定——便于有效关联。 表的设计遵守范式约束,考虑表的可扩展性,避免开发后期对表做大的改动。 Mysql或者Oracle中,修改数据类型相对比较简单,通过命令行或者navicat、sqldeveloper等可视化工具直接修改。 即便千万级别数据量,多等点时间,也能修改好。 而在Elasticsearch非关系型数据存储的搜索引擎中,设计表对应的就是Mapping的设计。 且ES中一旦
铭毅天下
2018/03/20
3.1K0
干货 | Elasticsearch5.X Mapping万能模板
Elasticsearch实战(六)-mapping映射
将该字段的值复制到目标字段,实现类似 _all 的作用,不会出现在 _source 中,只用来搜索
JavaEdge
2021/02/23
7580
Elasticsearch实战(六)-mapping映射
ElasticSearch系列18:Mapping 设计指南
ElasticSearch 的 mapping 该如何设计,才能保证检索的高效?想要回答这个问题,就需要全面系统地掌握 mapping 各种参数的含义以及其适用的场景。(ps:本文基于ElasticSearch 7.7.1)
方才编程_公众号同名
2020/11/13
1.6K0
ElasticSearch系列18:Mapping 设计指南
Elasticsearch数据类型及其属性
dynamic和data_detection的详解:Elasticsearch dynamic mapping(动态映射) 策略.
双面人
2019/08/30
10.3K0
Elasticsearch 时区问题 彻底搞懂
以下列举了几种不同字母表示时区的用法, 演示为主, 代码执行时最好将案例时间2024-05-18换成您这边执行的当天日期,这样比较容易在discover中去查看, 如果您这边用默认format, 直接看总结就行
牛朝阳
2024/09/04
6830
ELK专栏之ES索引-04
● 在生产上,我们需要自己手动建立索引和映射,是为了更好的管理索引,就像数据库的建表数据一样。
大忽悠爱学习
2022/09/29
6560
ELK专栏之ES索引-04
ElasticSearch数据类型Date介绍
本文主要简单介绍ES中的数据类型Date相关概念,希望对大家学习和理解ES有所帮助。
xdd
2022/07/12
1.9K0
Elasticsearch索引模板与动态mapping模板(四)
前面我们介绍了mapping相关的属性,细心的朋友可能会发现,在我们最开始使用ES的时候,可能还不太了解mapping,也没有添加过mapping为什么我们还是能够正常的添加文档。
问道白发
2019/12/15
5.1K0
Elasticsearch索引模板与动态mapping模板(四)
ElasticSearch 动态映射与静态映射
松哥原创的 Spring Boot 视频教程已经杀青,感兴趣的小伙伴戳这里-->Spring Boot+Vue+微人事视频教程
江南一点雨
2020/11/26
2.9K0
ElasticSearch 动态映射与静态映射
Elasticsearch 7.x 映射(Mapping)中的字段类型和结果各个字段介绍
一、Mapping 字段类型: Elasticsearch 字段类型类似于 MySQL 中的字段类型。Elasticsearch 字段类型主要有:核心类型、复合类型、地理类型、特殊类型。
用户4945346
2023/05/06
1.2K0
Elasticsearch 7.x 映射(Mapping)中的字段类型和结果各个字段介绍
python操作elasticsearch
参考:https://www.cnblogs.com/clonen/p/6674888.html
西西嘛呦
2021/10/25
1.3K0
Elasticsearch入门必备——ES中的字段类型以及常用属性
使用Elasticsearch时,了解字段的概念,是必不可少的。毕竟无论是es还是传统的数据库,都无法弱化字段的类型。 背景知识 在Es中,字段的类型很关键: 在索引的时候,如果字段第一次出现,会自动识别某个类型,这种规则之前已经讲过了。 那么如果一个字段已经存在了,并且设置为某个类型。再来一条数据,字段的数据不与当前的类型相符,就会出现字段冲突的问题。如果发生了冲突,在2.x版本会自动拒绝。 如果自动映射无法满足需求,就需要使用者自己来设置映射类型,因此,就需要使用者了解ES中的类型。 下面就步入正
用户1154259
2018/01/17
7.8K0
相关推荐
Elasticsearch 动态映射——自动检测
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档