具有两个 Y 轴的分组箱线图

2023-12-13

我想使用 GGPLOT2 为同一类别制作两个具有不同信息的箱线图,具有两个 Y 轴。 如下图所示:

enter image description here

我有区域(AM 和 AR)的两个类别信息(旋转速度和角度),并且我想将这两种运动模式组合在根据区域分组的图形中。

到目前为止我的代码如下所示:

areaveleang <- ggplot(dados2, aes(x = area)) +
        geom_boxplot(aes(y = speed, color="Bruto" ), fill = "darkblue", alpha=0.7) +
  geom_boxplot(aes(y = angulo_modulo), color="#a50026", position = "dodge") +
        scale_y_continuous(name = "speed (km/h)", sec.axis = sec_axis(~ . *6,name=expression("turn angle (graus)"))) +
                           #breaks = seq(0, 175, 25),
                           #limits=c(0, 175)) +
        scale_x_discrete(name = "Area") +
        #ggtitle("Boxplot of mean ozone by month") +
        theme_bw() +
        theme(plot.title = element_text(size = 14, family = "Tahoma", face = "bold"),
              text = element_text(size = 12, family = "Tahoma"),
              axis.title = element_text(face="bold"),
              axis.text.x=element_text(size = 11),
              legend.position = "bottom") +
        scale_fill_brewer(palette = "Accent")

我的部分数据:

structure(list(lon = c(-38.8745, -38.8676, -38.9445, -38.9811, 
-38.9322, -38.9386), lat = c(-14.09437, -14.25664, -14.34518, 
-14.51857, -14.95994, -15.41684), bmode = c(1.396, 1.375, 1.346, 
1.248, 1.074, 1.289), bmode.5 = c(1, 1, 1, 1, 1, 1), ID = structure(c(53L, 
53L, 53L, 53L, 53L, 53L), .Label = c("10946.05", "20162.03", 
"21792.03", "21800.03", "21810.03", "24640.03", "24641.05", "24642.03", 
"27258.05", "27259.03", "27261.03", "27261.05", "27261.07", "33000.05", 
"37231.07", "37234.05", "37288.07", "42521.07", "50682.07", "50687.07", 
"60004.07", "81122.09", "81123.09", "81124.09", "81125.09", "81126.09", 
"84497.1", "87632.12", "87759.08", "87761.08", "87762.08", "87763.08", 
"87764.08", "87765.08", "87766.08", "87768.08", "87768.11", "87769.11", 
"87770.08", "87773.08", "87773.1", "87773.11", "87774.09", "87774.11", 
"87775.08", "87776.08", "87776.11", "87777.1", "87778.08", "87783.09", 
"88724.1", "88727.09", "111868.11", "111871.12", "112702.12", 
"112712.12", "112714.12", "120947.12", "121189.12", "121192.12", 
"121196.12", "1211931.12"), class = "factor"), sex = structure(c(3L, 
3L, 3L, 3L, 3L, 3L), .Label = c("F", "Fc", "M"), class = "factor"), 
    speed = c(0.921691675, 2.990097297, 2.137609076, 3.259383146, 
    8.173674567, 8.413534172), area = structure(c(3L, 3L, 3L, 
    3L, 3L, 3L), .Label = c("AA", "AM", "AR"), class = "factor"), 
    angulo = c(41.027, -43.41, 29.056, 18.241, -7.125, -4.702
    ), angle_rel = c(0.7160619, -0.7576522, 0.5071251, 0.3183724, 
    -0.1243479, -0.08206201), bat.depth = c(-45L, -397L, -32L, 
    -29L, -21L, -3L), dist = c(5.53015005, 17.94058378, 12.82565446, 
    19.55629887, 49.0420474, 50.48120503), angulo_modulo = c(41.027, 
    43.41, 29.056, 18.241, 7.125, 4.702), curva = structure(c(1L, 
    1L, 1L, 1L, 1L, 1L), .Label = c("curva", "reta"), class = "factor")), row.names = 2:7, class = "data.frame")

PS:抱歉我的英语不好,我希望你能理解我的问题xD


不确定我是否正确,但也许这就是您正在寻找的:

  1. 为了获得正确的次轴比例,您必须对数据应用逆变换,即当您乘以 6 时,您必须除以angulo_modulo数据中增加了6。

  2. 为了躲避两个箱线图,我建议使用tidyr::pivot_longer这样你的两个变量就成为一个变量的两个类别,默认情况下命名为name当值去value。这样你就可以映射value on y and name on color, alpha and fill。默认情况下ggplot2将为您提供每个区域两个并排的箱线图。

library(ggplot2)
library(tidyr)
library(dplyr)

dados2 %>% 
  mutate(angulo_modulo = angulo_modulo / 6) %>% 
  pivot_longer(cols = c(speed, angulo_modulo)) %>% 
  mutate(name = factor(name, levels = c("speed", "angulo_modulo"))) %>% 
  ggplot(aes(x = area)) +
  geom_boxplot(aes(y = value, color = name, alpha = name, fill = name)) +
  scale_y_continuous(name = "speed (km/h)", sec.axis = sec_axis(~ . * 6, name = expression("turn angle (graus)"))) +
  scale_x_discrete(name = "Area") +
  scale_color_manual(values = c(angulo_modulo = "darkblue", speed = "#a50026")) +
  scale_alpha_manual(values = c(0.7, 1)) +
  theme_bw() +
  theme(plot.title = element_text(size = 14, family = "sans", face = "bold"),
        text = element_text(size = 12, family = "sans"),
        axis.title = element_text(face="bold"),
        axis.text.x=element_text(size = 11),
        legend.position = "bottom") +
  scale_fill_brewer(palette = "Accent")

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

具有两个 Y 轴的分组箱线图 的相关文章

随机推荐

  • Powershell - 仅打印引号之间的文本?

    如何让以下文本的输出仅显示引号中的文本 不带引号 示例文本 this is an apple it is red this is an orange it is orange this is an blood orange it is re
  • 如何使用 LINQ 在集合中选择集合?

    我有以下结构 public class ToolSettings public string Extension get set public ObservableCollection
  • 如何检测 Latin1 编码列中的 UTF-8 字符 - MySQL

    我即将承担将数据库从 Latin1 转换为 UTF 8 的繁琐且充满陷阱的任务 此时 我只想检查表中存储的数据类型 因为这将确定我应该使用什么方法来转换数据 具体来说 我想检查 Latin1 列中是否有 UTF 8 字符 最好的方法是什么
  • this._callback.apply 不是一个函数! Node.js Mysql错误

    控制器代码 app post savedata function req res var cope req body console log On server side console log cope Client ID var que
  • 在java中以300dpi打印到硬打印机

    好吧 我刚刚开始编写一个应该打印出图形的程序 我的几乎与位于此处的 Oracle 受版权保护的一模一样http docs oracle com javase tutorial 2d printing examples HelloWorldP
  • WooCommerce 3 中的条件产品价格购物车问题

    我修改了一个函数来为我的一些会员创建自定义价格 即正常价格为 1 美元 但如果您是铜牌会员 则为 2 美元 银牌会员为 3 美元 依此类推 价格在商店和单品页面上发生变化 但是 当产品添加到购物车时 价格将恢复为原始金额 我是否应该添加额外
  • 以非 root 用户身份运行厨师客户端

    我想在我的 Linux 机器上以测试用户身份运行 Chef client 为此 我在 client rb 文件中添加了来自 etc chef client rb 的缓存路径 cache path chef cache 然后我从测试用户 非r
  • 如何使用 Laravel Sanctum 和 React 修复 401 Unauthorized 错误?

    我有以下设置 Laravel 与 Homestead 一起运行 Domain laravel api test指向我的 Homestead 环境 使用自定义主机在本地运行 React npx create react app app lar
  • 从顺序很重要的未排序的 2D 点数组中插值轨迹

    我需要一种从 Nx2 点数组获取 Lx2 轨迹的方法 即将这些点连接成单个轨迹的方法 例如 从 5x2 点数组创建 10000x2 点数组 我尝试过使用interp1 and interp2但要么我不完全理解他们 要么他们没有做我需要的事情
  • Pandas 重新索引以填充缺失的日期,还是更好的填充方法?

    我的数据是工厂的缺勤记录 有些日子没有缺勤 因此没有记录当天的数据或日期 然而 与所示的其他示例相比 这变得很棘手 在任何一天 都可能由于各种原因而出现多次缺勤 数据中的日期与记录的比率并不总是 1 1 我希望的结果是这样的 index S
  • iPhone 上的网络可达性

    也许有一个好方法来确定我是否有互联网连接 3G或无线网络 谢谢 以下是一个名为 Google 的新搜索引擎揭示的内容 iPhone SDK 测试网络可达性
  • 仅当匹配阈值字节时才填充映射中的字符串值

    我有一个tasks我正在迭代并将每个任务对象附加到的列表对象StringBuilder随后是新行 如下所示 现在 我将继续在同一字符串生成器中附加任务对象 直到其达到 60000 字节的大小限制 一旦达到限制 我将将此字符串填充为映射中的值
  • 使用 php 的简单水平条形图

    我见过一个 Facebook 应用程序 其中单击单选按钮会呈现一个图表 如下所示 我想知道是否有任何类似的图形库可以通过它在 php 中生成相同的图形 Thanks Pankaj 实际上 生成这种图非常简单 只需使用两个DIVs 一个是 1
  • 使用 PHP 将表单数据从一个网页传递到另一个网页

    我在这里发现了一些类似的问题 但从答案中我没有完全了解应该如何工作 我在页面中有一个订阅表格
  • 实施 30 天计时试验 [已关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 独立 Mac 开发者的问题 如何以非邪恶的方式实施 30 天计时赛 在首选项中放
  • 如何在JAVA中将两个int合并为一个double?

    如果我有 int a 123 int b 456 如何得到 double c 123 456 这个怎么样 int a 123 int b 456 double c Double parseDouble a b
  • 使用具有固定页眉和页脚的 css 可变内容 div 高度

    我在使用 CSS 时遇到了一些问题 正在向这个精彩的社区寻求帮助 我正在尝试构建一个包含以下元素的布局 1 标题区 2 页脚区域 3 左侧窗格 4 内容区 我提出了以下 CSS 但我不认为这是完成我需要的操作的最佳方式 请在下面找到我正在寻
  • 设计时编辑器支持控件集合

    我想向组件添加一个表示控件集合的属性 并有一个集合编辑器 通过它我可以轻松选择属于该集合的控件 VS确实almost我想要的自动使用以下代码 Private controls As New List Of Control
  • PHP 将 Excel 导出到特定路径?

    是否可以将 PHP MySQL Excel 工作表导出到指定路径 例如 U 盘 这是因为我使用 php 作为销售点 我现在想要的只是单击一个按钮 它将从 MySQL 数据库收集记录并将其作为 excel 或 csv 文件导出到 USB 闪存
  • 具有两个 Y 轴的分组箱线图

    我想使用 GGPLOT2 为同一类别制作两个具有不同信息的箱线图 具有两个 Y 轴 如下图所示 我有区域 AM 和 AR 的两个类别信息 旋转速度和角度 并且我想将这两种运动模式组合在根据区域分组的图形中 到目前为止我的代码如下所示 are