如何在双y轴ggplot上显示图例

2024-02-21

我正在尝试使用 ggplot 绘制双 y 轴图表。首先我要说的是,我并不是在寻找关于这样做是否是良好做法的优点的讨论。我发现它们在查看基于时间的数据来识别两个离散变量的趋势时特别有用。我认为对此进行进一步讨论更适合交叉验证。

Kohske https://rpubs.com/kohske/dual_axis_in_ggplot2提供了一个很好的例子来说明如何做到这一点,到目前为止我已经使用了它,效果很好。然而,我无法为两个 y 轴添加图例。我也看到过类似的问题here https://stackoverflow.com/questions/3099219/how-to-use-ggplot2-make-plot-with-2-y-axes-one-y-axis-on-the-left-and-another and here https://stackoverflow.com/questions/22701606/how-to-plot-bars-and-one-line-on-two-y-axes-in-the-same-chart-with-r-ggplot/22734987#comment42005315_22734987但似乎没有人解决包含图例的问题。

我有一个使用 ggplot 中的钻石数据集的可重现示例。

Data

library(ggplot2)
library(gtable)
library(grid)
library(data.table)
library(scales)

grid.newpage()

dt.diamonds <- as.data.table(diamonds)

d1 <- dt.diamonds[,list(revenue = sum(price),
                        stones = length(price)),
                  by=clarity]

setkey(d1, clarity)

Charts

p1 <- ggplot(d1, aes(x=clarity,y=revenue, fill="#4B92DB")) +
  geom_bar(stat="identity") +
  labs(x="clarity", y="revenue") +
  scale_fill_identity(name="", guide="legend", labels=c("Revenue")) +
  scale_y_continuous(labels=dollar, expand=c(0,0)) + 
  theme(axis.text.x = element_text(angle = 90, hjust = 1),
        axis.text.y = element_text(colour="#4B92DB"), 
        legend.position="bottom")

p2 <- ggplot(d1, aes(x=clarity, y=stones, colour="red")) +
  geom_point(size=6) + 
  labs(x="", y="number of stones") + expand_limits(y=0) +
  scale_y_continuous(labels=comma, expand=c(0,0)) +
  scale_colour_manual(name = '',values =c("red","green"), labels = c("Number of Stones"))+
  theme(axis.text.y = element_text(colour = "red")) +
  theme(panel.background = element_rect(fill = NA),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_rect(fill=NA,colour="grey50"),
        legend.position="bottom")

# extract gtable
g1 <- ggplot_gtable(ggplot_build(p1))
g2 <- ggplot_gtable(ggplot_build(p2))


pp <- c(subset(g1$layout, name == "panel", se = t:r))
g <- gtable_add_grob(g1, g2$grobs[[which(g2$layout$name == "panel")]], pp$t,
                     pp$l, pp$b, pp$l)
# axis tweaks
ia <- which(g2$layout$name == "axis-l")
ga <- g2$grobs[[ia]]
ax <- ga$children[[2]]
ax$widths <- rev(ax$widths)
ax$grobs <- rev(ax$grobs)
ax$grobs[[1]]$x <- ax$grobs[[1]]$x - unit(1, "npc") + unit(0.15, "cm")
g <- gtable_add_cols(g, g2$widths[g2$layout[ia, ]$l], length(g$widths) - 1)
g <- gtable_add_grob(g, ax, pp$t, length(g$widths) - 1, pp$b)
# draw it
grid.draw(g)

问题:有人对如何显示图例的第二部分有一些建议吗?

以下是按顺序 p1、p2、组合 p1&p2 生成的图表,您会注意到组合图表中没有显示 p2 的图例。

p1

p2

合并 p1 和 p2


与上面使用的技术类似,您可以提取图例,绑定它们,然后用它们覆盖绘图图例。

所以从# draw it在你的代码中

# extract legend
leg1 <- g1$grobs[[which(g1$layout$name == "guide-box")]]
leg2 <- g2$grobs[[which(g2$layout$name == "guide-box")]]

g$grobs[[which(g$layout$name == "guide-box")]] <- 
                                  gtable:::cbind_gtable(leg1, leg2, "first")
grid.draw(g)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在双y轴ggplot上显示图例 的相关文章

  • 将绘图调用拆分为多个块

    我正在编写一个图的解释 其中我基本上将在第一个块中创建图 然后描述该输出 并在第二个块中添加一个轴 然而 似乎每个块都会强制一个新的绘图环境 因此当我们尝试使用以下命令运行块时会出现错误axis独自的 观察 output html docu
  • R 中的快速 QR 分解

    我有大量矩阵 需要对其执行 QR 分解并存储生成的 Q 矩阵 进行归一化 以便 R 矩阵在其对角线上具有正数 除了使用之外还有其他方法吗qr 功能 这是工作示例 system time Parameters for the matrix t
  • R独特的列或行与NA无可比拟

    有谁知道如果incomparables的论证unique or duplicated 曾经被实施过incomparables FALSE 也许我不明白它应该如何工作 无论如何 我正在寻找一个巧妙的解决方案 以仅保留与另一列相同的唯一列 或行
  • 为什么 dplyr filter() 不能在函数内工作(即使用变量作为列名)?

    使用 dplyr 函数对数据进行过滤 分组和变异的函数 基本管道序列在函数之外工作得很好 这就是我使用真实列名称的地方 将其放入一个函数中 其中列名称是一个变量 并且某些函数可以工作 但有些函数则不能 尤其是 dplyr filter 例如
  • 以引用透明的方式从函数的省略号参数中提取符号

    事情又发生了 我正要按下发布答案按钮的问题被删除了 我正在寻找一种方法来从函数的省略号参数中提取绑定到符号的对象的值以及符号 也就是说 我试图以引用透明的方式从省略号中提取符号 我尝试过使用替代品和lazy dots 但没有成功 funct
  • 使用 R 选择第一个非 NA 值

    df lt data frame ID c 1 1 1 2 3 3 3 test c NA 5 5 6 4 NA 7 3 NA 10 9 我想创建一个名为 value 的变量 它是每个单独 ID 测试的第一个非 NA 值 对于只有NA的个体
  • r 中训练和测试数据的最小最大缩放/归一化

    我正在创建一个函数 它将训练集和测试集作为其参数 最小 最大缩放 标准化并返回训练集并使用这些same最小值和最小 最大范围的值 标准化并返回测试集 到目前为止 这是我想出的功能 min max scaling lt function tr
  • 朴素贝叶斯分类器仅基于先验概率做出决策

    我试图根据推文的情绪将推文分为三类 买入 持有 卖出 我正在使用 R 和包 e1071 我有两个数据框 一个训练集和一组需要预测情绪的新推文 训练集数据框 text sentiment this stock is a good buy Bu
  • ddply 和aggregate 之间的区别

    有人可以通过以下示例帮助我了解聚合和 ddply 之间的区别 数据框 mydat lt data frame first rpois 10 10 second rpois 10 10 third rpois 10 10 group c re
  • 将阴影区域添加到五分位数之间的直方图中

    All 我有一个包含 2 个直方图的图表 其中我还绘制了代表第 20 40 60 和 80 个百分位数的线条 下面的代码使用虚拟数据重现了类似的图表 data lt rbind data frame x rnorm 1000 0 1 g o
  • 如何仅删除单括号并保留配对的括号

    你好 我亲爱的老师 R 用户朋友们 我最近开始认真学习正则表达式 最近我遇到了一种情况 我们只想保留配对括号 并省略未配对的 这是我的样本数据 structure list t1 c Book Pg 1 Website Online Jou
  • 计算 R 中各列的唯一值

    我正在尝试创建一个新变量 其中包含来自两个不同列的字符串值的唯一计数 所以我有这样的东西 例如 A tibble 4 x 2 names partners
  • R 的 ggplot2 有 Python API 吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我的问题就像标题一样简单 我想使用R s ggplot2但我所有的数据处理都是在Python 有没有Py
  • 纵向比较 R 中的值...并进行扭转

    我有许多人在多达四个时间段进行的测试结果 这是一个示例 dat lt structure list Participant ID c A A A A B B B B C C C C phase structure c 1L 2L 3L 4L
  • 投资决策:R中的NPV、IRR、PB计算

    我正在尝试计算不同数量项目的净现值 NPV 内部收益率 IRR 和投资回收期 PB 时间 以评估哪个投资项目提供最佳回报 到目前为止 我可以为每个项目单独计算几行代码 但我想做的是 编写一个函数 它接受一个包含许多不同项目及其现金流的矩阵
  • 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并将其转换为其等效整数 尽管花了一些时间翻
  • SPSS 中的标准化残差与 R rstandard(lm()) 不匹配

    在寻找 R 相关解决方案时 我发现 R 和 SPSS 版本 24 在计算简单线性模型中的标准化残差方面存在一些不一致 看来SPSS所谓的标准化残差匹配 R学生化残差 我完全不认为某处存在软件错误 但显然这两个程序之间存在差异 看看这个例子
  • 无法更改 RStudio 中的 R 版本

    我的 RStudio V 0 99 491 无法更改 R 版本 我以平常的方式行事Global Options gt R Version 然后它挂起并且不再工作或反应 R 运行良好的初始版本是R 3 1 0 我以前从未遇到过这样的问题 也许
  • 在 ifelse() 语句内部和外部运行一行时的不同输出

    我正在尝试运行一个简单的命令 但不知道为什么在内部和外部运行它时输出不同ifelse 功能 函数条件评估为FALSE 所以输出应该完全相同 但是 单独运行时 输出为0 0 1 1 0 1 0 1 NA 根据需要 但是从ifelse 函数 输
  • 麦当劳 omega:R 中的警告

    我正在计算几种不同尺度的欧米茄 并在 R 中使用不同的 omega 函数获取不同比例的不同警告消息 我的问题是如何解释这些警告以及报告检索到的 omega 统计数据是否安全 当我使用 从 alpha 到 omega 内部一致性估计普遍问题的

随机推荐

  • Symfony 表单值缺失

    我正在编写一个简单的登录表单 一切正常 验证等 但我无法获取值 这是我的代码 public function executeIndex sfWebRequest request this gt getUser gt clearCredent
  • 计算时间序列中的运行和/衰减值

    我正在寻找计算时间序列内特定类型的 递减 总和或衰减值 例如 假设我有一些简单的数据 thedata lt data frame magicseeds c 30 20 10 40 20 week seq from 1 to 5 by 1 我
  • Android Kotlin:从目录中获取图像

    我正在使用 Kotlin 前端 Python 后端构建一个应用程序 我的 python 脚本在 getFilesDir 目录 data user 0 com example myproject files mygraph png 下创建一个
  • 如何在 Talend 中动态猜测 Mysqlinput 中的架构

    我已经构建了一个将数据从 mysql db 表复制到 b mysql 表的作业 表列是相同的 只是有时可以在表数据库中添加新列 我想检索从 a 到 b 的所有列 但只检索表 b 中存在的那些列 我能够放入表 b 中存在的查询特定选择列语句
  • 如果我将 extern "C++" 与 C 工具链一起使用会发生什么?

    我的问题主要是关于 C 工具链 理解 C 和 C 的事实 所以如果我用extern C 对于 C 工具链 我认为它可以理解如何处理它 但是如果我用以下代码提供代码怎么办extern C 到 C 工具链 预期的行为是什么 如果编译器也理解 C
  • 使用 Daper.Net 和 NPGSQL 将数据插入 PostgreSQL jsonb 列

    我正在尝试使用 Dapper Net 将 JSON 数据插入到 JSONB PostgreSQL 列中 The JSONB 的 NPGSQL 文档 http www npgsql org doc faq html给出了具体的使用说明Npgs
  • 尝试将隐藏的输入值发送到下一页

    我正在尝试根据客户的需求调整 Wordpress Jigoshop 但遇到了一些困难 我需要的是 当选择产品变体时 一些附加选项以单选按钮的形式出现 客户必须选择 我已经设法让一切正常工作 但我现在需要的是在单击提交按钮时将选定的单选按钮发
  • 是否可以对最小化的应用程序进行屏幕截图

    我知道可以捕获另一个应用程序后面的应用程序的屏幕 但我似乎找不到任何有关捕获最小化应用程序屏幕的信息 有人知道这是否可能吗 我不想很快就涉及最大化和最小化应用程序之类的事情 正如 ziplin 所说 对于较新版本的 Windows 这可能是
  • iPhone/iOS 中 viewDidAppear 和 viewDidLoad 之间的区别? [复制]

    这个问题在这里已经有答案了 最重要的是 我一直在开发一个应用程序 似乎如果我放置一个UIAlert in viewDidLoad 它被调用两次 从委托方法UIImagePickerController 如果我把它放进去viewDidAppe
  • python 中的导入是否被视为动态链接?

    用 posix 和通用技术软件开发的话说 是否有import一个纯粹的python 不是cython或c编译的库 模块构成动态链接 不 加载纯 Python 模块不被视为动态链接的一种形式 传统的动态链接将机器代码加载到新的内存块中 并且可
  • 如何将更改的文件添加到 Git 中较旧的(不是最后一次)提交

    在过去的一个小时里 我改变了几件事 并一步步提交它们 但我刚刚意识到我忘记在一些提交之前添加更改的文件 日志看起来像这样 GIT TidyUpRequests u 1 d 0 gt git log commit fc6734b6351f6c
  • 抽象类型集合的获取策略

    所以情况是这样的 假设我有一个用于表示灵活搜索的类结构 public class SearchDefinition public virtual string Name get set public virtual IEnumerable
  • 活动目录属性

    在 stackoverflow 上两个人的帮助下 我已经弄清楚如何使用下面的代码设置 用户无法更改密码 我现在正在想办法如何删除该财产 我认为将拒绝标志设置为 允许 会起作用 但它似乎没有任何作用 如果可能的话 我希望代码使用 Direct
  • iOS:使用 playInputClick 与使用音频工具箱的 (1104) 声音文件之间是否存在性能差异?

    苹果建议使用playInputClick在自定义键盘中模拟点击声 更容易实施AudioServicesPlaySystemSound 1104 所以我的问题就变成了playInputClick提供更好的性能还是同一件事 苹果推荐这样做的原因
  • Plone 4.1.4 安装失败:lxml 构建失败:libxml2:

    预期结果 Successful installtion of Plone 4 1 4 实际结果 Installation fails with libxml2 cmmi failed Stack Ubuntu Ubuntu 10 04 4
  • 上面的注释栏:

    ggplot 中躲避的条形图再次让我难住了 几周前 我询问了有关在此处的栏上方注释文本的问题 LINK https stackoverflow com questions 9815226 annotate values above bars
  • .NET Core MVC 自动迁移后,类库在 VS2017 中丢失智能感知

    将具有两个项目 Web 应用程序和类库 的 VS2015 MVC Core 应用程序迁移到 VS2017 后 我失去了类库中所有视图的智能感知 几乎每个视图中的所有内容都被破坏了 所以我确信迁移工具没有为我处理这是相当基本的事情 即便是 m
  • 如何检查指针是否指向正确对齐的内存位置?

    Given a void 对于某些存储 如何检查它是否指向正确对齐的存储而没有任何实现定义的行为 当然我们有std align http en cppreference com w cpp memory align 但是有更有效的方法吗 t
  • 如何将 OAuth 2 令牌映射到资源服务器中的 UserDetails 对象?

    我有 2 个独立的 Spring Boot 应用程序 一个用作 OAuth 2 授权服务器 另一个用作资源服务器 我正在使用Spring的RemoteTokenServices在我的资源服务器中检查来自授权服务器的令牌 现在 我尝试在资源服
  • 如何在双y轴ggplot上显示图例

    我正在尝试使用 ggplot 绘制双 y 轴图表 首先我要说的是 我并不是在寻找关于这样做是否是良好做法的优点的讨论 我发现它们在查看基于时间的数据来识别两个离散变量的趋势时特别有用 我认为对此进行进一步讨论更适合交叉验证 Kohske h