在多面 ggplot 中自动勾选最大值和最小值

2024-01-01

我试图在多面 ggplot 中标记每个 x 轴的最大值和最小值。我有几个具有不同 x 尺度和相同 y 尺度的面,并且 x 轴刻度标签相互重叠。我正在寻找一种方法来标记每个方面的最小值和最大值,而不是手动确定每个方面 x 轴的限制和中断。

使用示例数据的代码CO2数据集(参见?CO2):

CO2$num <- 1:nrow(CO2)
library(reshape2)
CO2.melt <- melt(CO2,
                 id.var=c("Type",
                          "Plant",
                          "Treatment",
                          "num"))
CO2.melt <- CO2.melt[order(CO2.melt$num),]

library(ggplot2)
ggplot(CO2.melt, 
       aes(x = value, 
           y = num)) +
  geom_path(aes(color = Treatment)) +
  facet_wrap( ~ variable, scales = "free_x",nrow=1)

目的是复制测井记录显示,例如this one http://certmapper.cr.usgs.gov/data/PubArchives/OF00-200/WELLS/TULAGEA1/LAS/TL1LOG.JPG.


当您想为刻度标签实现此功能时,请使用scales = "free_x"在多面图中使得这很难自动化。但是,通过一些修补和其他几个软件包的帮助,您还可以使用以下方法:

1)总结数据以了解您在 x 轴上需要哪些刻度标签/中断:

library(data.table)
minmax <- melt(setDT(CO2.melt)[, .(min.val = min(value), max.val = max(value),
                                   floor.end = 10*ceiling(min(value)/10),
                                   ceil.end = 10*floor((max(value)-1)/10)),
                               variable][],
               measure.vars = patterns('.val','.end'),
               variable.name = 'var',
               value.name = c('minmax','ends'))

这使:

> minmax
   variable var minmax ends
1:     conc   1   95.0  100
2:   uptake   1    7.7   10
3:     conc   2 1000.0  990
4:   uptake   2   45.5   40

2)为每个方面创建中断向量:

brks1 <- c(95,250,500,750,1000)
brks2 <- c(7.7,10,20,30,40,45.5)

3)创建面:

p1 <- ggplot(CO2.melt[CO2.melt$variable=="conc",], 
             aes(x = value, y = num, colour = Treatment)) +
  geom_path() +
  scale_x_continuous(breaks = brks1) +
  theme_minimal(base_size = 14) +
  theme(axis.text.x = element_text(colour = c('red','black')[c(1,2,2,2,1)],
                                   face = c('bold','plain')[c(1,2,2,2,1)]),
        axis.title = element_blank(),
        panel.grid.major = element_line(colour = "grey60"),
        panel.grid.minor = element_blank())

p2 <- ggplot(CO2.melt[CO2.melt$variable=="uptake",], 
             aes(x = value, y = num, colour = Treatment)) +
  geom_path() +
  scale_x_continuous(breaks = brks2) +
  theme_minimal(base_size = 14) +
  theme(axis.text.x = element_text(colour = c('red','black')[c(1,2,2,2,2,1)],
                                   face = c('bold','plain')[c(1,2,2,2,2,1)]),
        axis.title = element_blank(),
        panel.grid.major = element_line(colour = "grey60"),
        panel.grid.minor = element_blank())

4)将图例提取到一个单独的对象中:

library(grid)
library(gtable)
fill.legend <- gtable_filter(ggplot_gtable(ggplot_build(p2)), "guide-box")
legGrob <- grobTree(fill.legend)

5)创建最终情节:

library(gridExtra)
grid.arrange(p1 + theme(legend.position="none"), 
             p2 + theme(legend.position="none"), 
             legGrob, ncol=3, widths = c(4,4,1))

结果是:


自动执行此操作的可能替代解决方案是使用geom_text or geom_label。展示如何实现此目标的示例:

# create a summary
library(dplyr)
library(tidyr)
minmax <- CO2.melt %>% 
  group_by(variable) %>% 
  summarise(minx = min(value), maxx = max(value)) %>%
  gather(lbl, val, -1)

# create the plot
ggplot(CO2.melt, aes(x = value, y = num, color = Treatment)) +
  geom_path() +
  geom_text(data = minmax, 
            aes(x = val, y = -3, label = val), 
            colour = "red", fontface = "bold", size = 5) +
  facet_wrap( ~ variable, scales = "free_x", nrow=1) +
  theme_minimal()

这使:

您还可以即时获取内部的最小值和最大值ggplot(归功于@eipi10 https://stackoverflow.com/a/35923085/2204410)。另一个例子使用geom_label:

ggplot(CO2.melt, aes(x = value, y = num, color = Treatment)) +
  geom_path() +
  geom_label(data = CO2.melt %>% 
               group_by(variable) %>% 
               summarise(minx = min(value), maxx = max(value)) %>%
               gather(lbl, val, -1), 
             aes(x = val, y = -3, label = val), 
             colour = "red", fontface = "bold", size = 5) +
  facet_wrap( ~ variable, scales = "free_x", nrow=1) +
  theme_minimal()

这使:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在多面 ggplot 中自动勾选最大值和最小值 的相关文章

  • ODE 时间 Matlab 与 R

    如果在 matlab 中使用可变时间步长求解器 例如 ODE45 我会定义输出的时间跨度 即times 0 50 matlab 将返回 0 到 50 之间不同时间步长的结果 然而在 R 中 我似乎必须定义我希望 ODE 返回结果的时间点 即
  • R 中舍入到下一个数量级的算法

    如果标题不清楚 我很抱歉 但我无法简洁地解释它 给定一个浓度向量 我想将最大值四舍五入到下一个数量级 即 345 到 1000 另外 我想将最小值四舍五入到较低的数量级 即 3 2 到 1 这些浓度也可能低于 1 因此例如 0 034 需要
  • 如果落在 R 中另一个数据集中的两个变量定义的范围内,则从一个数据集中获取变量值

    我有一个关于 R 中日期操作的问题 我已经查了好几天了 但在网上找不到任何帮助 我有一个数据集 其中有 id 和两个日期 另一个数据集具有相同的 id 变量 日期和价格 例如 x data frame id c A B C C date1
  • 如何编写固定宽度的文件?

    我应该编写一个基于固定宽度列的特定格式的 txt 文件 例如 第 1 8 列中的第一个变量 第 9 15 列中的第二个变量 原始数据有不同的长度 它们必须放在指定列的右侧 例如 值 15 96 和 12 489 必须写入第一行和第二行的第1
  • dplyr::group_by_ 带有多个变量名的字符串输入

    我正在编写一个函数 要求用户在函数调用中定义一个或多个分组变量 然后使用 dplyr 对数据进行分组 如果只有一个分组变量 它会按预期工作 但我还没有弄清楚如何使用多个分组变量来做到这一点 Example x lt c cyl y lt c
  • R xts 对象中从每日时间序列到每周时间序列

    我正在使用 Zoo 和 xts 包来分析财务数据 ts 包不太合适 因为金融系列有周末 没有可用数据 我读到了 xts 包中可用的 apply 函数 apply daily x FUN apply weekly x FUN apply mo
  • 为特定 ID 重新编码列中的观察结果

    我有一个数据集 称为 调查 其中有行是个人 ID 列中有许多问题 我需要将 1 列中的值重新编码为 NA 并将观察结果移至另一列 例如 ID Fruit Vegetable aaa NA grape bbb NA tomato ccc ap
  • 关于在 LyX 中生成和交叉引用 knitr 图的意见

    我的目标是在 LyX 中包含一个knitr图 我可以在我的文档中交叉引用 我 插入了浮动图像 添加了标题和标签 在浮动图像中插入了 ERT 而不是图像 我所做的图片如下 我在这里检查过类似的问题 但没有人做我所做的事情 所以我在这里问 有没
  • Rcpp 包不包含 Rcpp_precious_remove

    我一直在尝试创建数据库并安装 DBI 包 但仍然遇到此错误 我重新安装了 DBI 和 RSQLite 软件包 但它们似乎不起作用 library DBI con lt dbConnect RSQLite SQLite dbname memo
  • 使用栅格包下载 SRTM 数据?

    我正在尝试使用 获取 SRTM 数据 raster R 中的包 但一旦我选择SRTM在 getData 命令中 我会收到以下错误 library raster srtm lt getData SRTM lon 16 lat 48 tryin
  • R 中的 aov() 错误术语:bw Error(id) 和 Error(id/timevar) 规范有什么区别?

    两者有什么区别aov depvar timevar Error id 和aov depvar timevar Error id timevar 配方规格 这两种变体产生略有不同的结果 同样的问题曾经在这里被问过 https stats st
  • 从 SpatialPolygons 和其他 sp 类中提取要素坐标

    Package sp为不同的空间概念 点 线 多边形 提供了许多类 对于某些类 访问要素坐标很简单 例如SpatialLines 所有示例均取自相应课程的帮助页面 l1 cbind c 1 2 3 c 3 2 2 l1a cbind l1
  • 时间序列,将月度数据改为季度

    现在我有一些每月数据 例如 1 1 90 620 2 1 90 591 3 1 90 574 4 1 90 542 5 1 90 534 6 1 90 545 etc 如果我使用 ts 函数 很容易将数据转换为时间序列结构 例如 Jan F
  • 设置设备默认图形参数

    我经常喜欢在 IDE 中使用浅色文本和深色背景颜色主题 当我在 R 中绘制某些内容时 绘图的默认颜色方案是白色背景上的黑色文本 边框 点 我试图默认更改此设置 最好是默认从 R 调用的特定设备 X11cairo RStudioGD 同时保留
  • 如何一次执行多个 RSQLite 语句或如何转储整个文件?

    使用 RSQLite 构建 SQLite 数据库 我想一次发送多个语句 这可能吗 为什么要做这些not work sql lt readLines createtables sql dbSendQuery con sql 和 sql lt
  • R闪亮:在渲染表格时显示“正在加载...”消息

    在 Rstudio Shiny 中 我得到了一些renderDataTable通过 RMySQL 从数据库获取信息的调用 有些查询可能需要几秒钟才能完成 我想添加一条 正在加载 消息 其中表格将在等待时最终呈现 这个问题与这个问题类似 R闪
  • r 闪亮下载过滤数据表(DT)

    我正在尝试做一个shiny应用程序下载过滤后的Datatable 过滤与search 通过删除行进行过滤delete button 下载部分按预期工作 问题 当我第一次使用数据表中的搜索区域进行过滤时 如果我使用按钮删除一行 它会重置第一个
  • 根据R中的行差异对行进行分组[重复]

    这个问题在这里已经有答案了 我有一组具有不同采样间隔的动物位置 我想要做的是采样间隔符合特定标准 例如低于特定值 的组和序列 让我用一些虚拟数据来说明 start lt Sys time timediff lt c rep 5 3 20 r
  • 有条件地为 R 中置信带之外的数据点着色

    我需要对下图中置信带之外的数据点与带内的数据点进行不同的着色 我是否应该在数据集中添加一个单独的列来记录数据点是否在置信区间内 您能举个例子吗 示例数据集 Dataset from http www apsnet org education
  • R 中的插补 MICE 仍不存在于数据集中

    运行 MICE 包后 5 个完整插补集中的缺失值数量从 147428 减少到 46093 但不是应该是 0 NA 吗 Thanks 这是我的 MICR 代码 imp mice newdata imputationSet1 complete

随机推荐

  • 单个 malloc 中的多个结构调用未定义的行为?

    From 声明灵活数组成员时使用正确的语法 https wiki sei cmu edu confluence display c DCL38 C Use the correct syntax when declaring a flexib
  • Java 中 lambda 的返回值

    到目前为止 我设法找到了我需要的所有答案 但这个让我感到困惑 假设我们有示例代码 public class Animal private String species private boolean canHop private boole
  • 解析错误:语法错误,意外的“;” [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions Hallo
  • 绝对定位div上的css3高度过渡到溢出自动失败[重复]

    这个问题在这里已经有答案了 我想这个例子是不言自明的 我不知道为什么 div 首先缩小 然后弹出到正确的高度 这是示例代码 div class block div class abs hover me br Lorem ipsum dolo
  • Ninject运行时异常频繁发生-System.InvalidOperationException:Collection被修改;枚举操作可能无法执行

    我在 Webforms 应用程序中使用 Ninject 2 2 1 0 和 Ninject Web 2 2 0 0 我每天都会收到以下错误报告 System InvalidOperationException Collection was
  • 使用 AccountManager 通过 Google API 进行身份验证

    我已经为此苦苦挣扎了几天 我正在尝试通过 Android 的身份验证来调用 Google 日历AccountManager 我使用通常的方法检索身份验证令牌 AccountManager manager AccountManager get
  • 是否可以禁用 onclick 而不改变其功能?

    我知道禁用的方法onclick元素上的事件是 element onclick null 启用 element onclick function something or element addEventListener click me 这
  • 如何在 Google 跟踪代码管理器中添加 Adsense

    我想使用 Google 跟踪代码管理器来投放 Adsense 这样我还可以使用其他来源的其他广告 我在网站上找到的答案很少 但不足以理解 如果可以在 GTM 中使用 Adsense 代码 我将不胜感激 如果可以 如何 我也使用DFP 如果我
  • Phonegap - Android 初始屏幕 - 中心徽标

    有人可以建议我如何设置启动屏幕以实现交叉分辨率吗 我尝试将 png 文件的大小重新调整为不同的尺寸 并将图像放置在 ldpi mdpi hdpi 文件夹中 但图像看起来仍然被拉伸 压扁 具体取决于设备 有没有一种方法可以将徽标放置在屏幕中央
  • UIautomatorviewer 无法创建 java 虚拟机

    我开始在 Mac 上使用 Appium 和 Android Studio 当我尝试从命令行启动 uiautomatorviewer 时 出现以下错误 Djava ext dirs Users chris gill Library Andro
  • 代码中的“+=(s,e)”是什么意思?

    到底是什么 s e 在代码中 例子 this currentOperation Completed s e gt this CurrentOperationChanged 这是使用 Lambda 表达式附加事件处理程序的方法 例如 butt
  • 在 LESS CSS 中生成随机数?

    尝试搜索此内容 但考虑到语法 这很困难 有没有办法在 LESS 中生成随机数 我检查了文档 但没有看到任何内容 但想知道是否有人知道技巧或未记录的解决方案 通过 LESS Mixin 进行变化 通过使用 LESS mixin 来生成随机数
  • 在较长的序列中查找子序列

    我需要在其他大序列中找到一个序列 例如 1 3 2 3 存在于 1 3 2 3 4 3 and 5 1 3 2 3 有什么办法可以快速完成IEnumerable或与其他东西 与 dlev 类似 但这也可以处理 1 1 1 2 Contain
  • 如何访问 Pandas 系列中的最后一个元素

    让我们考虑以下数据框 import pandas as pd d col1 1 2 3 col2 3 4 5 df pd DataFrame data d 如果我想访问 pandas 系列中的第一个元素df col1 我可以简单地去df c
  • LinkedBlockingQueue 具有快速 contains(Object o) 方法?

    简而言之 我正在编写一个需要BlockingQueue实现既提供 FIFO 添加 删除 又提供快速contains方法 我将其称为 TON LinkedBlockingQueue让我大部分时间都到了那里 但看起来它contains方法以线性
  • 如何更改/覆盖 Vuetify js 中禁用字段的默认颜色?

    默认情况下 vuetify 对禁用的文本字段 项目应用浅灰色阴影 我如何将这种颜色覆盖为我想要的颜色 目前我正在使用禁用选择器 disabled color 000000 important 这仅有助于更改文本字段文本颜色的颜色 我的表单中
  • C 的 strtok() 和只读字符串文字

    char strtok c har s1 const char s2 重复调用此函数将字符串 s1 分解为 标记 即 字符串被分成子字符串 每个都以 0 结尾 其中 0 替换任何字符 包含在字符串 s2 中 第一次通话 使用要标记为 s1
  • Android - 如何以编程方式将证书存储在密钥库中?

    我正在制作一个金融交易 Android 应用程序 它需要 SSL 身份验证 我成功地完成了它 Android 和 Tomcat 之间的握手 我使用 keytool 和 openSSL 生成服务器和客户端证书 Tomcat 证书格式为 JKS
  • HTTP_HOST 服务器变量是否始终已定义?

    是服务器变量HTTP HOST总是为所有服务器定义 或者例如在 IIS 中使用其他名称定义 甚至根本没有定义 另外 该值总是被定义的 或者某些主机没有定义该值 还有其他方法可以检索该值吗 引用手册 HTTP HOST 是 Contents
  • 在多面 ggplot 中自动勾选最大值和最小值

    我试图在多面 ggplot 中标记每个 x 轴的最大值和最小值 我有几个具有不同 x 尺度和相同 y 尺度的面 并且 x 轴刻度标签相互重叠 我正在寻找一种方法来标记每个方面的最小值和最大值 而不是手动确定每个方面 x 轴的限制和中断 使用