Log10 x 轴位于顶部,y 轴位于 geom_line

2024-02-27

我在 ggplot2 中创建了一个图表,如下所示:

depth = c(1.6,2.6,3.6, 4.6,5.6,6.6,7.6,8.6) 
ri <- c(0.790143779,1.485888068,2.682375391,1.728120227,0.948414515,71.43308158,4.416120653,0.125458801)
df = data.frame(depth,ri) 

library(ggplot2)

m <- qplot(ri, depth, data=df)
m + 
scale_x_log10("Richardson Number",breaks = c(0.1,0.25,0.5,1,5,10, 50)) + 
scale_y_reverse("Depth (m)")

这是输出:

我想做的是让 x 轴沿着顶部,并且还包括一个 geom_line ,就像我在此处添加的那样(在 Paint 中手动添加)。

我知道很难让 ggplot2 移动轴,并且我尝试在 ggvis 中重现该图,但我无法获得我需要的 log10 比例。有什么方法可以使用 R 来创建我想要的图表吗?


更新的解决方案

As of ggplot2.2.0,可以在面板顶部(和/或面板右侧)绘制轴

library(ggplot2)

depth = c(1.6,2.6,3.6, 4.6,5.6,6.6,7.6,8.6) 
ri <- c(0.790143779,1.485888068,2.682375391,1.728120227,0.948414515,71.43308158,4.416120653,0.125458801)
df = data.frame(depth,ri) 

m <- qplot(ri, depth, data=df) +
   scale_x_log10("Richardson Number",breaks = c(0.1,0.25,0.5,1,5,10, 50),
         position = "top") + 
   scale_y_reverse("Depth (m)")+
   geom_path()

原解决方案原来的,稍加更新后到ggplot version2.2.0。

轴可以使用以下方式移动gtable功能。改编@Walter's 答案的代码here https://stackoverflow.com/questions/18989001/how-can-i-put-a-transformed-scale-on-the-right-side-of-a-ggplot2,基本思想是:获取轴(轴文字和刻度线);反转轴文本和刻度线;在绘图面板正上方的 gtable 布局中添加一个新行;将修改后的轴插入新行。

library(ggplot2)
library(gtable)
library(grid)


depth = c(1.6,2.6,3.6, 4.6,5.6,6.6,7.6,8.6) 
ri <- c(0.790143779,1.485888068,2.682375391,1.728120227,0.948414515,71.43308158,4.416120653,0.125458801)
df = data.frame(depth,ri) 

m <- qplot(ri, depth, data=df) +
  scale_x_log10("Richardson Number",breaks = c(0.1,0.25,0.5,1,5,10, 50)) + 
  scale_y_reverse("Depth (m)")+
  geom_path()


# Get ggplot grob
g1 <- ggplotGrob(m)  

## Get the position of the plot panel in g1
pp <- c(subset(g1$layout, name == "panel", se = t:r))

# Title grobs have margins. 
# The margins need to be swapped.
# Function to swap margins - 
# taken from the cowplot package:
# https://github.com/wilkelab/cowplot/blob/master/R/switch_axis.R
vinvert_title_grob <- function(grob) {
  heights <- grob$heights
  grob$heights[1] <- heights[3]
  grob$heights[3] <- heights[1]
  grob$vp[[1]]$layout$heights[1] <- heights[3]
  grob$vp[[1]]$layout$heights[3] <- heights[1]

  grob$children[[1]]$hjust <- 1 - grob$children[[1]]$hjust 
  grob$children[[1]]$vjust <- 1 - grob$children[[1]]$vjust 
  grob$children[[1]]$y <- unit(1, "npc") - grob$children[[1]]$y
  grob
}

# Get  xlab  and swap margins
index <- which(g1$layout$name == "xlab-b")
xlab <- g1$grobs[[index]]
xlab <- vinvert_title_grob(xlab)

# Put xlab at the top of g1
g1 <- gtable_add_rows(g1, g1$heights[g1$layout[index, ]$t], pp$t-1)
g1 <- gtable_add_grob(g1, xlab, pp$t, pp$l, pp$t, pp$r, clip = "off", name="topxlab")

# Get x axis (axis line, tick marks and tick mark labels)
index <- which(g1$layout$name == "axis-b")
xaxis <- g1$grobs[[index]]

# Swap axis ticks and tick mark labels
ticks <- xaxis$children[[2]]
ticks$heights <- rev(ticks$heights)
ticks$grobs <- rev(ticks$grobs)

# Move tick marks
  #  Get tick mark length
  plot_theme <- function(p) {
    plyr::defaults(p$theme, theme_get())
  }
  tml <- plot_theme(m)$axis.ticks.length   # Tick mark length

ticks$grobs[[2]]$y <- ticks$grobs[[2]]$y - unit(1, "npc") + tml

# Swap tick mark labels' margins and justifications
ticks$grobs[[1]] <- vinvert_title_grob(ticks$grobs[[1]])

# Put ticks and tick mark labels back into xaxis
xaxis$children[[2]] <- ticks

# Add axis to top of g1
g1 <- gtable_add_rows(g1, g1$heights[g1$layout[index, ]$t], pp$t)
g1 <- gtable_add_grob(g1, xaxis, pp$t+1, pp$l, pp$t+1, pp$r, clip = "off", name = "axis-t")

# Remove original x axis and xlab
g1 = g1[-c(9,10), ]

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

Log10 x 轴位于顶部,y 轴位于 geom_line 的相关文章

  • 选择 R 中的数据表中隐藏时(在绿色加号下方)列的显示顺序

    Context 使用 DataTables 库制作交互式表格时 当屏幕宽度对于列的数量和宽度来说太窄时 列将隐藏在绿色 号下 我有一个非常宽的表格 有 20 多列 其中一些内容非常冗长 因此某些列在所有屏幕宽度下总是隐藏的 每次隐藏新列时
  • 绘制点之间的所有线

    我有以下 R 代码 x lt c 0 01848598 0 08052353 0 06741172 0 11652034 y lt c 0 4177541 0 4042247 0 3964025 0 4074685 d lt data fr
  • kernlab 中 SVM 训练之外的核矩阵计算

    我正在开发一种新算法 该算法可以生成修改后的核矩阵以用于 SVM 训练 但遇到了一个奇怪的问题 出于测试目的 我比较了使用 kernelMatrix 接口和普通内核接口学习的 SVM 模型 例如 Model with kernelMatri
  • R独特的列或行与NA无可比拟

    有谁知道如果incomparables的论证unique or duplicated 曾经被实施过incomparables FALSE 也许我不明白它应该如何工作 无论如何 我正在寻找一个巧妙的解决方案 以仅保留与另一列相同的唯一列 或行
  • Purrr::map_df() 删除 NULL 行

    使用时purrr map df 我偶尔会传递一个数据框列表 其中一些项目是NULL 当我做 map df 返回行数少于原始列表的数据框 我想发生的事情是这样的map df calls dplyr bind rows 它忽略了NULL价值观
  • 使用 Shiny 发布平行坐标图表时出现“错误:路径[1]="”:没有这样的文件或目录”

    我有一个似乎很常见但我还没有找到解决方案的问题 当尝试使用 rCharts Parcoords 发布 Web 应用程序时 出现以下错误 错误 路径 1 没有这样的文件或目录 奇怪的是 该应用程序在我的笔记本电脑上运行得很好 下面是我正在使用
  • 文本挖掘 pdf 文件/词频问题

    我正在尝试挖掘一篇具有丰富 pdf 编码和图表的文章的 pdf 我注意到 当我挖掘一些 pdf 文档时 我得到的高频词是 phi taeoe toe sigma gamma 等 它与某些 pdf 文档配合良好 但与其他文档配合使用时却得到这
  • 旋转 Markdown 的表格 pdf 输出

    我想将 pdf 上的表格输出旋转 90 度 我正在使用 Markdown 生成报告并kable循环显示表格 如果可以的话我想继续使用kable因为还有很多其他依赖于它的东西我没有包含在这个 MWE 中 这是一个简单的例子 使用iris数据集
  • 在 Rcpp 中使用其他包中的 C 函数

    我试图从 C 函数中的 cubature 包调用 C 例程来执行多维积分 我试图重现的基本 R 示例是 library cubature integrand lt function x sin x adaptIntegrate integr
  • 如何在 R 中匹配多个 ggplot2 图中的调色板?

    自从被问到这个问题以来已经有一段时间了 但我知道一个事实 我很快就会提取新数据 我想弄清楚如何用这种技术来绘制它 看起来评论和答案中的人知道如何做到这一点 但我无法完全弄清楚所给我的内容 还有人想尝试一下吗 我正在尝试使用具有多个级别的因子
  • 为什么 R 更新后 sim_slopes() 中会出现此错误?

    我正在尝试使用 交互 包来创建简单斜率的约翰逊 尼曼图 但是 当尝试运行 sim slopes 函数时 出现以下错误 直到我将R更新到4 2 2 我才没有遇到这个问题 我使用的是 macOS Ventura 13 1 Error class
  • ggplot2:如何标记事件发生的日期

    我想从第二个情节中获取第一个情节的信息 第二张图表示事件发生的天数 它看起来更宽 因为它没有图例 但它是相同的时间尺度 我选择在第一个图中手动分配颜色 I would like to overlay the second plot dots
  • R:如何获取该月的周数

    我是 R 新手 我想要该日期所属月份的周数 通过使用以下代码 gt CurrentDate lt Sys Date gt Week Number lt format CurrentDate format U gt Week Number 3
  • 如何从 R 读取 PDF 元数据

    我们很好奇 有没有一种方法可以从 R 读取 PDF 元数据 例如下面显示的信息 通过搜索我对此无能为力 r pdf metadata在当前的问题库中 非常欢迎任何指点 我想不出纯 R 的方法来执行此操作 但您可能可以安装您最喜欢的 PDF
  • python 相当于 R 中的 get() (= 使用字符串检索符号的值)

    在 R 中 get s 函数检索名称存储在字符变量 向量 中的符号的值s e g X lt 10 r lt XVI s lt substr r 1 1 X get s 10 取罗马数字的第一个符号r并将其转换为其等效整数 尽管花了一些时间翻
  • 以编程方式将字符串宽度值插入到 sprintf() 中

    我正在尝试以编程方式将字符串宽度值插入到sprintf 格式 期望的结果是 sprintf 20s hello 1 hello 但我想插入20在同一通话中即时进行 因此它可以是任何号码 我努力了 sprintf ds 20 hello 1
  • 无法更改 RStudio 中的 R 版本

    我的 RStudio V 0 99 491 无法更改 R 版本 我以平常的方式行事Global Options gt R Version 然后它挂起并且不再工作或反应 R 运行良好的初始版本是R 3 1 0 我以前从未遇到过这样的问题 也许
  • 如何将plot中的单变量列表图表转换为ggplot2格式?

    我正在搜索 但仍然找不到一个非常简单的问题的答案 我们如何使用 R 中的 ggplot2 生成一个变量的简单线图 我正在分析时间序列数据 并且想要对图表进行更复杂的操作 我认为如果我使用 ggplot2 代替会更好plot It works
  • 线性判别分析图

    如何将样本 ID 行号 作为标签添加到此 LDA 图中的每个点 library MASS ldaobject lt lda Species data iris plot ldaobject panel function x y points
  • 如何使用 dplyr 独立过滤每列的行

    我有以下内容 library tidyverse df lt tibble tribble gene colB colC a 1 2 b 2 3 c 3 4 d 1 1 df gt A tibble 4 x 3 gt gene colB c

随机推荐

  • Azure 机器学习 REST 端点 - 无法获取

    我创建了一个带有 REST 端点的 Azure 机器学习模型作为使用它的方式 当我使用 Postman 运行服务时 一切似乎都工作正常 但是 当我尝试使用 javascript 创建 HTML 网站 Codepen 来调用 REST 端点时
  • 在 Selenium IDE 中,如何通过下拉菜单中的索引选择选项?

    问题是选项标签发生变化 所以我无法按标签抓取 我需要通过说选项 0 来抓取 任何想法 我正在使用 Selenium IDE Firefox 这是我要问的部分 tr td select td td dateRangeString td td
  • 什么是 PDO?为什么要使用它?

    人们不断提到我在处理 MySQL 时应该在 PHP 中使用 PDO 我以前从未听说过这一点 什么是PDO 它是如何使用的以及有哪些优点和缺点 Thanks 将 PDO 视为与 PHP 一起打包的内置类 使您可以更轻松地与数据库进行交互 在开
  • 当字符串为空时将字符串值替换为“0”

    我从文本框中获取一个值并将其转换为十进制 但是 文本框值可能为空 那么 我该如何处理文本框中的空字符串呢 不幸的是 我有大约 50 个文本框需要处理 所以像 用 IF 条件检查 null 这样的答案对我没有帮助 如果我使用所有这些 IF 条
  • 从 GNU 到Solaris 的等效日期

    In GNU使用命令 date 我可以做到这一点 date d 4 day datei 20130101 i 5 date d datei i day 但我喜欢知道 我怎样才能在 Solaris 中做到这一点 使用日期命令 Tcl 有一个很
  • Pylance - pandas 方法的类型部分未知

    如果我尝试在严格模式下验证使用 pandas 方法和 pylance 的代码 则会收到验证错误 import pandas as pd ser pd Series float pd Series 1 2 5 3 print ser max
  • 如何使用管道将数据帧列作为函数中的参数传递?

    我正在摆弄内置数据集economics在 R 中 我试图将数据帧列作为参数传递到使用管道的函数中 dplyr https genomicsclass github io book pages dplyr tutorial html gt 但
  • 如何禁用 Android 的 Facebook 单点登录 - Facebook-android-sdk

    facebook android 的 SSO 每次都会给我 invalid key 我尝试用各种方法进行调试 但它不起作用 那么 即使设备上安装了 Facebook 应用程序 是否有任何方法 黑客可以禁用单点登录并使用 Web 视图身份验证
  • Phonegap 插件:如何在 Android 中将 Base64 字符串转换为 PNG 图像

    Android 不允许本机应用程序 例如基于 Phonegap 的应用程序 写入二进制文件 一个常见的应用是将 Base64 字符串转换为图像 那么 您如何解决这个问题呢 解决方案 该插件可转换 Base64 PNG 字符串并生成图像到 s
  • 如何将 ubuntu 命令提示符下的 jar 输出重定向到文本文件

    我创建了 jar 文件并使用以下命令运行它 java jar niidle jar arguments 它显示正确的输出 但我看不到整个输出 我想看到整个输出 那么当我运行以下命令时 如何将整个事情重定向到文本文件 java jar nii
  • 如何在 PHP 中复制 Excel FV 函数?

    我正在将一些相当复杂的计算从 Excel 电子表格转换为 PHP 我被困在 Excel 的 FV 函数的转换上 它的定义如下 FV interest rate number payments payment PV Type 我已经为此工作了
  • 更改源文件后,Visual Studio 2010 提示“构建失败,但没有错误”

    我有一个包含几个项目的 Visual Studio 2010 解决方案 我可以使用 构建 gt 构建解决方案 或 构建 gt 构建 MyCompany MyProduct MyProject 成功构建 构建后 我按 CTRL F5 并成功运
  • ASP.NET MVC 模型状态

    ModelState IsValid 在我的控制器中为我返回 false 我知道这意味着模型绑定时发现一个或多个模型错误 我的问题是如何查看错误 我注意到我的特定 ModelState 有 6 个项目 如果我尝试做其中任何一个 ModelS
  • 绕过 try/catch 块以检查异常的 Lambda 表达式

    由于我尝试提取一些在大多数项目中使用的常见包装 lambda 例程 我已经能够创建CheckedFunction 子类为PermeableFunction绕过 try catch 块的功能接口 我已经在 Windows v1 8 0 251
  • Python requests lib 花费的时间比执行 get 请求的时间要长

    所以我有这个代码 每当我运行代码并到达第 3 行时 执行 get 请求大约需要 20 秒 没有理由花这么长时间 而且每次都花很长时间 有什么帮助吗 def get balance addr try r requests get http b
  • 如何在 Java 中固定字节数组?

    有没有办法在java中固定字节数组 这样它就不会被移动 压缩 我正在开发一个应用程序 该应用程序旨在在运行时具有零 GC 并且我想使用固定到内存映射区域的原始字节数组 有什么办法可以做到这一点或者破解我的方法吗 您可以使用 ByteBuff
  • .NET Core 3 预览版 4:“AddNewtonsoftJson”未定义

    使用 NET Core 3 预览版 4 F ASP NET MVC 项目的 API 模板无法构建 这没有对模板进行任何更改 这是失败的代码 type Startup private member this ConfigureServices
  • 将 DatePicker 添加到模态时出现问题 - 在背景中显示

    我正在尝试插入我在这里找到的 DatePicker http www eyecon ro bootstrap datepicker http www eyecon ro bootstrap datepicker 但我无法让它显示在我的模态前
  • Python 从磁盘刷新文件

    我有一个 python 脚本 它调用系统程序并从文件读取输出out txt 作用于该输出并循环 然而 它不起作用 仔细调查发现 python脚本只是打开out txt一次 然后继续阅读旧版本 如何让 python 脚本在每次迭代时重新读取文
  • Log10 x 轴位于顶部,y 轴位于 geom_line

    我在 ggplot2 中创建了一个图表 如下所示 depth c 1 6 2 6 3 6 4 6 5 6 6 6 7 6 8 6 ri lt c 0 790143779 1 485888068 2 682375391 1 728120227