热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

将两个ggplots转换为一个

如何解决《将两个ggplots转换为一个》经验,为你挑选了1个好方法。

我面临一些问题,从单独的数据框中有一个图而不是两个图.我在下面解释了一下情况.数据框看起来像:

df1 <- structure(list(value = c(9921L, 21583L, 11822L, 1054L, 13832L, 
16238L, 13838L, 20801L, 20204L, 13881L, 19935L, 13829L, 14012L, 
20654L, 13862L, 21191L, 3777L, 15552L, 13817L, 20428L, 16850L, 
21003L, 11072L, 22477L, 12321L, 12856L, 16295L, 11431L, 13469L, 
14680L, 10552L, 15272L, 9132L, 9374L, 15123L, 22754L, 10363L, 
12160L, 13729L, 11151L, 11451L, 11272L, 14900L, 14688L, 17133L, 
7315L, 7268L, 6262L, 72769L, 7650L, 16389L, 13027L, 7134L, 6465L, 
6490L, 15183L, 7201L, 14070L, 11210L, 10146L), limit = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("1Mbit", 
"5Mbit", "10Mbit"), class = "factor")), class = "data.frame", row.names = c(NA, 
-60L))

df2 <- structure(list(value = c(37262L, 39881L, 30914L, 32976L, 28657L, 
39364L, 39915L, 30115L, 29326L, 36199L, 37976L, 36694L, 33718L, 
36945L, 33182L, 35866L, 34188L, 33426L, 32804L, 34986L, 29355L, 
30470L, 37420L, 26465L, 28975L, 29144L, 27491L, 30507L, 27146L, 
26257L, 31231L, 30521L, 30370L, 31683L, 33774L, 35654L, 34172L, 
38554L, 38030L, 33439L, 34817L, 31278L, 33579L, 31175L, 31001L, 
29908L, 31658L, 33381L, 28709L, 34794L, 34154L, 30157L, 33362L, 
30363L, 31097L, 29116L, 27703L, 31229L, 30196L, 30077L), limit = structure(c(3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("180ms", 
"190ms", "200ms"), class = "factor")), class = "data.frame", row.names = c(NA, 
-60L))

从上面的数据框中,我有这些图:

limit_bw <- factor(df1$limit, levels = c("1Mbit", "5Mbit", "10Mbit"))
limit_lt <- factor(df2$limit, levels = c("200ms", "190ms", "180ms"))

(按顺序使用它们)

bw_line <- ggplot(df1, aes(x = limit_bw, y = value, group=1)) + geom_quantile(method = "loess")
lt_line <- ggplot(df2, aes(x = limit_lt, y = value, group=1)) + geom_quantile(method = "loess")

(我实际上有很多数据,所以我用过geom_quantile())

还有两个使用网格的图rbind/cbind (现在不是我想要的):

grid.draw(rbind(ggplotGrob(ggplot(df1, aes(limit_bw,value,group=1)) + geom_quantile(method = "loess") + labs(title = "value vs bw",x="bandwidth",y="value")),
ggplotGrob(ggplot(df2, aes(limit_lt, value, group = 1)) + geom_quantile(method="loess") + labs(title="value vs latency", x="latency", y="value")), size = "last"))

我正在寻求你的帮助将它们合并成一个图(在同一图表中放置bw_linelt_line在一起),在顶部和底部显示两个x轴,或者在底部的两个轴提及它们的标题.请注意,value每个数据集的范围不同.但是,我需要为每个数据帧显示两个y轴用于不同的范围,或者可以是一个y轴,显示来自两个数据帧的所有值(最小值到最大值).

事实上,我看到一个非常接近的解决方案在这里从@RichieCotton但无法弄清楚我的数据,因为我有一些factors,而不是整数值.

我非常感谢你的帮助.谢谢.



1> Jon Spring..:

我认为通过首先将数据合并到一个数据框中来解决这个问题可能是最容易的.在这里,我组合x值并将数据映射到那些.然后我们照常映射,添加辅助y轴.

library(tidyverse); library(forcats)

# Create shared x axis and combine data frames
limit_combo <- data.frame(level_num = 1:3, 
                          level = as_factor(c("1Mbit\n200ms",
                                              "5Mbit\n190ms",
                                              "10Mbit\n180ms"))) 
df1b <- df1 %>%
  mutate(level_num = limit %>% as.numeric) %>%
  left_join(limit_combo)
df2b <- df2 %>%
  mutate(level_num = 4 - (limit %>% as.numeric)) %>%
  left_join(limit_combo)
df3 <- bind_rows(df1b, df2b, .id = "plot") %>%
  mutate(plot = if_else(plot == "1", "bw", "lt"))

# plot with adjusted y values and second axis for reference
ggplot(df3, aes(x = level, 
                y = value * if_else(plot == "lt", 0.44, 1), 
                group=plot, color = plot)) + 
  geom_quantile(method = "loess") +
  scale_y_continuous("value", sec.axis = sec_axis(~./0.44)) +
  theme(axis.text.y.left  = element_text(color = "#F8766D"),
        axis.text.y.right = element_text(color = "#00BFC4"))

在此输入图像描述


推荐阅读
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 标题: ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • 使用Spring AOP实现切面编程的步骤和注意事项
    本文介绍了使用Spring AOP实现切面编程的步骤和注意事项。首先解释了@EnableAspectJAutoProxy、@Aspect、@Pointcut等注解的作用,并介绍了实现AOP功能的方法。然后详细介绍了创建切面、编写测试代码的过程,并展示了测试结果。接着讲解了关于环绕通知的使用方法,并修改了FirstTangent类以添加环绕通知方法。最后介绍了利用AOP拦截注解的方法,只需修改全局切入点即可实现。使用Spring AOP进行切面编程可以方便地实现对代码的增强和拦截。 ... [详细]
  • 解决python matplotlib画水平直线的问题
    本文介绍了在使用python的matplotlib库画水平直线时可能遇到的问题,并提供了解决方法。通过导入numpy和matplotlib.pyplot模块,设置绘图对象的宽度和高度,以及使用plot函数绘制水平直线,可以解决该问题。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
author-avatar
腾讯财经321
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有