R绘制双坐标轴

2023-11-02

目录

 

方法一:ggplot中的sec.axis函数

 

方法二:plotrix包中的twoord.plot()函数和twoord.stackplot()函数


方法一:ggplot中的sec.axis函数

ggplot2支持直接显示在辅助轴上的数据的1:1转换。 在创建辅助轴时,需重新计算第二个右侧轴上显示的参数,并将其添加到绘图中。 以下示例说明了如何利用它显示两个参数,且每个参数都有其唯一的数据范围。

library(ggplot2) # must be version > 2.2.0
library(ReadAxfBOM) 
# 数据导入
obs <- ReadAxfBOM("http://www.bom.gov.au/fwo/IDV60901/IDV60901.94866.axf")

# show first observations
head(obs)
##             Timestamp   wmo              name history_product
## 1 2016-11-15 12:30:00 94866 Melbourne Airport        IDV60901
## 2 2016-11-15 12:00:00 94866 Melbourne Airport        IDV60901
## 3 2016-11-15 11:30:00 94866 Melbourne Airport        IDV60901
## 4 2016-11-15 11:00:00 94866 Melbourne Airport        IDV60901
## 5 2016-11-15 10:30:00 94866 Melbourne Airport        IDV60901
## 6 2016-11-15 10:00:00 94866 Melbourne Airport        IDV60901
##   local_date_time local_date_time_full aifstime_utc   lat   lon apparent_t
## 1      15/12:30pm       20161115123000 2.016112e+13 -37.7 144.8        9.9
## 2      15/12:00pm       20161115120000 2.016112e+13 -37.7 144.8       10.6
## 3      15/11:30am       20161115113000 2.016112e+13 -37.7 144.8        9.9
## 4      15/11:00am       20161115110000 2.016112e+13 -37.7 144.8        9.8
## 5      15/10:30am       20161115103000 2.016111e+13 -37.7 144.8       10.1
## 6      15/10:00am       20161115100000 2.016111e+13 -37.7 144.8        9.3
##           cloud cloud_base_m cloud_oktas cloud_type_id cloud_type delta_t
## 1  Mostly clear          660           1             7    Stratus     3.4
## 2 Mostly cloudy          600           7            35       <NA>     3.5
## 3  Mostly clear          570           1             7    Stratus     3.1
## 4  Mostly clear          570           1             7    Stratus     2.9
## 5  Mostly clear          630           1             7    Stratus     3.2
## 6  Mostly clear          630           2             7    Stratus     2.5
##   gust_kmh gust_kt air_temp dewpt  press press_qnh press_msl press_tend
## 1       32      17     14.9   8.1 1020.1    1020.3    1020.1       <NA>
## 2       32      17     15.2   8.3 1020.2    1020.4    1020.2          R
## 3       28      15     14.2   8.0 1020.1    1020.3    1020.1       <NA>
## 4       30      16     14.0   8.2 1020.1    1020.3    1020.1       <NA>
## 5       26      14     14.4   8.0 1020.0    1020.2    1020.0       <NA>
## 6       26      14     13.3   8.3 1020.0    1020.2    1020.0       <NA>
##   rain_trace rel_hum sea_state swell_dir_worded swell_height swell_period
## 1          0      64        NA               NA        -9999        -9999
## 2          0      63        NA               NA        -9999        -9999
## 3          0      66        NA               NA        -9999        -9999
## 4          0      68        NA               NA        -9999        -9999
## 5          0      65        NA               NA        -9999        -9999
## 6          0      72        NA               NA        -9999        -9999
##   vis_km weather wind_dir wind_spd_kmh wind_spd_kt extreme_event
## 1     10    <NA>       SW           24          13         FALSE
## 2     30    Fine       SW           22          12         FALSE
## 3     10    <NA>       SW           20          11         FALSE
## 4     10    <NA>       SW           20          11         FALSE
## 5     10    <NA>      SSW           20          11         FALSE
## 6     10    <NA>       SW           19          10         FALSE
# 绘制气候温度图 
p <- ggplot(obs, aes(x = Timestamp))
  p <- p + geom_line(aes(y = air_temp))
p

# 增加湿度
p <- p + geom_line(aes(y = rel_hum))
p

 

由于辅助轴只能显示右y轴的一对一转换,因此我们必须转换辅助轴上显示的数据。 在这种情况下,相对湿度除以5。

p <- ggplot(obs, aes(x = Timestamp))
  p <- p + geom_line(aes(y = air_temp, colour = "Temperature"))
  
  # adding the relative humidity data, transformed to match roughly the range of the temperature
  p <- p + geom_line(aes(y = rel_hum/5, colour = "Humidity"))
  
  # now adding the secondary axis, following the example in the help file ?scale_y_continuous
  # and, very important, reverting the above transformation
  p <- p + scale_y_continuous(sec.axis = sec_axis(~.*5, name = "Relative humidity [%]"))
  
  # modifying colours and theme options
  p <- p + scale_colour_manual(values = c("blue", "red"))
  p <- p + labs(y = "Air temperature [°C]",
                x = "Date and time",
                colour = "Parameter")
  p <- p + theme(legend.position = c(0.8, 0.9))
p

scales包提供了一个重新校正的函数,scales:rescale(), 可以将辅助参数转换为任何所需范围,然后,将主要的y轴刻度线与次要的刻度线进行匹配是一个手动过程。

在这个例子中,可以说相对湿度和空气温度通过众所周知的水蒸气压和饱和蒸气压函数相互关联。 因此,在这种情况下,即使在所有温度下都不是1:1的线性关系,也可以以相同的比例将它们显示在变换的比例尺上。

rescale函数应用

lct <- Sys.getlocale("LC_TIME")  
#备份本地默认日期显示格式

Sys.setlocale("LC_TIME", "C")    
#指定标准日期显示格式

Sys.setlocale("LC_TIME",lct)     
#这一句是恢复默认系统日期显示格式
#(记得要在使用完下面的month函数之后再运行这一句,否则月份返回的是中文)

加载包:
library("lubridate")
library("ggplot2")
library("scales")
library("magrittr")
library("tidyr")
data1 <- data.frame(
  Month = seq(from = as.Date('2017-01-01'),to=as.Date('2017-06-01'),by='1 month') %>% month(label=TRUE),
  Value = runif(6,10,50) %>% round()
)
data2 <- data.frame(
  Month = seq(from = as.Date('2017-01-01'),to=as.Date('2017-06-01'),by='1 month') %>% month(label=TRUE),
  Categroy1 = runif(6,0.1,0.5) %>% round(2),
  Categroy2 = runif(6,0.1,0.5) %>% round(2)
) %>% gather(Category,Value,-1)


ggplot() +
  geom_col( data = data1,aes(x = Month,y = Value),fill="#6794a7") +
  geom_line(data = data2,aes(x = Month,y = rescale(Value,c(0,55)),colour=Category,group=Category),size=1.5) +#将折线图的数据源量级(0.0~0.5)放大到0~55的区间上
  geom_point(data = data2,aes(x = Month,y = rescale(Value,c(0,55)),colour=Category),shape=21,fill="white",size=4)+
  scale_y_continuous(breaks=pretty_breaks(5),sec.axis = sec_axis( ~rescale(.,c(0,0.5)),name = "Categroy",labels=sprintf("%d%%",(0:5)*10)))+ #将之前已经被标准化到0~50区间内的原始度量标签通过rescale函数再次标准化到0~0.5区间内
  scale_color_manual(label = c("Categroy1", "Categroy2"),values = c("#ee8f71","#C10534")) +
  labs(
    title="This is a Title!",
    subtitle="This is a Subtitle",
    caption="This is a Caption"
  )+
  theme_minimal(base_size=16) %+replace% 
  theme(
    plot.caption = element_text(hjust=0),
    plot.margin = unit(c(1,0.5,1,0.5), "lines")
  )

本例子中

p <- ggplot(obs, aes(x = Timestamp))
p <- p + geom_line(aes(y = air_temp, colour = "Temperature"))

# adding the relative humidity data, transformed to match roughly the range of the temperature
p <- p + geom_line(aes(y = rescale(rel_hum,c(0,30)), colour = "Humidity"))

# now adding the secondary axis, following the example in the help file ?scale_y_continuous
# and, very important, reverting the above transformation
p <- p + scale_y_continuous(sec.axis = sec_axis(~rescale(.,c(40,110), 
                                                         name = "Relative humidity [%]")))
                            

#sec.axis = sec_axis( ~rescale(.,c(0,0.5))
# modifying colours and theme options
p <- p + scale_colour_manual(values = c("blue", "red"))
p <- p + labs(y = "Air temperature [°C]",
              x = "Date and time",
              colour = "Parameter")
p <- p + theme(legend.position = c(0.8, 0.9))
p

 

方法二:plotrix包中的twoord.plot()函数和twoord.stackplot()函数

library(plotrix)
# NOT RUN {
xval1 <- seq.Date(as.Date("2017-01-02"),
                  as.Date("2017-01-10"), by="day")
xval2 <- seq.Date(as.Date("2017-01-01"),
                  as.Date("2017-01-15"), by="day")
going_up<-seq(3,7,by=0.5)+rnorm(9)
going_down<-rev(60:74)+rnorm(15)
twoord.plot(2:10,going_up,1:15,going_down,xlab="Sequence",
            ylab="Ascending values",rylab="Descending values",lcol=4,
            main="Plot with two ordinates - points and lines",
            do.first="plot_bg();grid(col=\"white\",lty=1)")
axis.Date(1,xval2)

# separate the lines
twoord.plot(2:10,going_up,1:15,going_down,xlab="Sequence",
            lylim=range(going_up)+c(-1,10),rylim=range(going_down)+c(-10,2),
            ylab="Ascending values",ylab.at=5,rylab="Descending values",
            rylab.at=65,lcol=4,main="Plot with two ordinates - separated lines",
            lytickpos=3:7,rytickpos=seq(55,75,by=5),
            do.first="plot_bg();grid(col=\"white\",lty=1)")

twoord.plot(2:10,going_up,1:15,going_down,xlab="Sequence",
            lylim=range(going_up)+c(-1,10),rylim=range(going_down)+c(-10,2),
            type=c("bar","l"),ylab="Ascending values",ylab.at=5,
            rylab="Descending values",rylab.at=65,
            main="Bars on left axis, lines on right axis",
            lytickpos=3:7,rytickpos=seq(55,75,by=5),
            lcol=3,rcol=4,do.first="plot_bg()")

time <- 0:25

A <- 1+1/2*sin(time/2)
B <- A + rnorm(length(A), sd=1/10)
B <- B + rnorm(length(A), sd=1/10)

sizeA <- floor(450*(1 + 1/4*sin(time/2+2))*(1+.1))
sizeB <- 1000-sizeA

C <- (A*sizeA + B*sizeB)/(sizeA+sizeB)

 

twoord.stackplot(lx=time, rx=time, ldata=cbind(sizeA, sizeB), 
                 rdata=cbind(A, B, C),  lcol=c("grey80", "white"), 
                 rcol=c("blue", "red","black"), ltype="bar", rtype=c("l","p","o"), 
                 border="grey80", lylab="Size", rylab="A,B,C", xlab="Time", 
                 main="a plot", incrylim=2/100)

 

#reverse the order of plotting
twoord.stackplot(lx=time, rx=time, ldata=cbind(sizeA, sizeB), 
                 rdata=cbind(A, B, C),  lcol=c("grey80", "white"), 
                 rcol=c("blue", "red","black"), ltype="bar", rtype=c("l","p","o"), 
                 border="grey80", lylab="Size", rylab="A,B,C", xlab="Time", 
                 main="a plot", incrylim=2/100, leftfront=TRUE)

 

参考资料:

https://rpubs.com/MarkusLoew/226759

https://rdrr.io/cran/plotrix/man/twoord.stackplot.html

https://www.rdocumentation.org/packages/plotrix/versions/3.7-8/topics/twoord.plot

https://zhuanlan.zhihu.com/p/31872309

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

R绘制双坐标轴 的相关文章

  • ggplot2 方面的内部排序

    我正在尝试在 ggplot2 中绘制一个方面 但我很难使不同方面的内部顺序正确 数据如下 head THAT EXT ID FILE GENRE NODE 1 CKC 1823 01 CKC Novels better 2 CKC 1824
  • 有什么方法可以禁用 PDF/Postscript 输出中的“减号破解”吗?

    在 R 中 将绘图保存到 PDF 或 Postscript 文件时 轴标签中的连字符会变成减号 显然 这是设计使然 根据 postscript 设备的文档 正常编码规则 有一个例外 字符 45 始终设置为负号 其在 Adob e ISOLa
  • 从 SpatialPolygons 和其他 sp 类中提取要素坐标

    Package sp为不同的空间概念 点 线 多边形 提供了许多类 对于某些类 访问要素坐标很简单 例如SpatialLines 所有示例均取自相应课程的帮助页面 l1 cbind c 1 2 3 c 3 2 2 l1a cbind l1
  • ggplot 中的分层轴?

    我想知道是否可以在 GGLPOT2 或其他图形包 我只是更喜欢 ggplot 中制作分层 分段轴 我想要做的是获取下面的数据 制作一个堆积条形图 其中 x 轴上有周期 但在每个周期内 还有每种动物 那么每只动物内的条形颜色将是 颜色 变量
  • 使用 ggplot 将条形图的列与线图的点对齐

    当线图的点与条形图的条具有相同的 x 轴时 有什么方法可以使用 ggplot 将它们对齐 这是我尝试使用的示例数据 library ggplot2 library gridExtra data data frame x rep 1 27 e
  • 通过单击堆叠条形图打开选项卡

    我正在使用 R 构建一个包含转发的堆积条形图 ggplot and plotly 如果单击条形图的一部分 我希望打开一个新的浏览器选项卡并显示该特定日期的推文以及指定的转发量 但是 当我单击下面示例中的其中一个栏时 会打开一个不同的链接 表
  • 使用示例代码继续在 ggplot2 中遇到错误“loop_apply”未从当前命名空间(plyr)解析”

    我今天一直遇到这个错误 我已经从 github 下载了 plyr 但它仍然不起作用 安装 plyr 后 我重新启动了 R studio 甚至我的电脑 看来问题可能是由于 R 解析对外部 DLL 的引用的方式发生了变化 正如线程中途提到的he
  • 在 R 中按邮政编码绘制美国地图上的点,并插入阿拉斯加和夏威夷

    我正在尝试以密度点格式在美国地图上绘制点 其中每个邮政编码的点的大小根据该邮政编码中从事某种职业的人数而定 我已经非常接近我需要的东西 但正在努力获取阿拉斯加和夏威夷的坐标 它们需要在插图上 这里的第一组代码是我所拥有的 loc full2
  • 在函数内部和外部创建的 ggplot2 对象之间的 RDS 文件大小差异

    我正在尝试构建一个使用函数生成多个 ggplot2 对象的 R 项目 但是 我注意到 将这些对象保存为 RDS 文件时 文件大小比我预期的要大得多 我意识到 保存使用函数生成的 RDS 对象以及全局环境中的相同绘图会产生两个截然不同的文件大
  • 在R中的箱线图中添加不同的百分位数

    我对 R 不太熟悉 最近用它来制作一些箱线图 我还在箱线图中添加了平均值和标准差 我想知道是否也可以在不同的百分位数中添加某种刻度线或圆圈 假设我想在每个小时箱线图中标记第 85 个 第 90 个百分位数 有没有办法做到这一点 我的数据包含
  • R 在设置宽度和高度的 PDF 中缩放绘图元素

    尽管发送到 PDF 的 R 图可以在插图或页面布局软件中随意重新缩放 但科学期刊通常坚持提供的图具有特定的尺寸 是否可以直接在 R 中在给定 PDF 大小内缩放所有绘图元素的大小 require ggplot2 p lt qplot dat
  • 更改 ggplot 对象的数据集

    我正在绘制数据的子集ggplot2我想知道我是否会以某种方式使用已包含在ggplot原始数据子集中的对象 举个例子 这是第一个图 代码块 1 require ggplot2 p lt ggplot mtcars aes mpg wt col
  • 如何强制geom_point在R中显示比例大小?

    我的数据如下 抱歉有点大 test dput 我还有一个绘制这些数据的代码 这里的问题是它没有给我比例大小read counts value多变的 我怎样才能解决这个问题 谢谢 my code p ggplot test dput aes
  • ggplot2 stat_function,具有针对facet_grid内不同数据子集的计算参数

    我有一个关于如何通过的后续问题fitdistr计算参数为stat function see here https stackoverflow com questions 24949065 multiple stat function on
  • ggplot - 标签为计算的增加 (%)

    我已经开发了一个 ggplot 图 但现在我正在尝试添加计算标签 该标签显示同比增长百分比 我的数据框非常简单 主数据集聚合的结果 data frame 4 obs of 3 variables Year int 2011 2012 201
  • 在 R GGplot 中创建自定义填充

    我想在 R 中制作这些形状 每个形状都有自己的形状 黑色轮廓 然后我想有条件地用我拥有的值填充这些值 您可以忽略文本 因此 如果可能的话 我想将七个形状绘制在一起 谢谢 代码比较简单 library tidyverse ggplot df
  • 如何在 ggplot 中保持配色方案,同时删除每个图中未使用的级别?

    我想比较一个图中的数据的一些子组和另一图中的一些其他子组 如果我绘制一个图 其中绘制了所有子组 那么这个数字将是巨大的 并且每个单独的比较都会变得困难 我认为如果给定的子组在所有图中都具有相同的颜色 这对读者来说会更有意义 这是我尝试过的两
  • 绘制点之间的所有线

    我有以下 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
  • 如何在 R 中匹配多个 ggplot2 图中的调色板?

    自从被问到这个问题以来已经有一段时间了 但我知道一个事实 我很快就会提取新数据 我想弄清楚如何用这种技术来绘制它 看起来评论和答案中的人知道如何做到这一点 但我无法完全弄清楚所给我的内容 还有人想尝试一下吗 我正在尝试使用具有多个级别的因子
  • 如何将plot中的单变量列表图表转换为ggplot2格式?

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

随机推荐

  • ChatGPT总结(持续更新)

    目录 体验渠道 weTab CSDN AI助手 其他插件 ChatGPT简介 ChatGPT主要用途 ChatGPT发展历程 GPT 4架构的特点和优势 ChatGPT的工作原理 神经网络和自然语言处理技术 Transformer模型 模型
  • c++纯虚数一个报错 cannot declare variable ‘a‘ to be of abstract ty

    官方点说是因为没有在子类中完成对基类的虚函数的定义 使得子类不能实例化 通俗点点说是因为父类中的纯虚数在子类中没有全部实例化 就是说明这个是做什么的 即使不用也要在子类中实例化一下 我今天就是因为想着不用先不写 结果一直报错
  • 大数据:Hive视图和索引

    一 视图 1 1 简介 Hive 中的视图和 RDBMS 中视图的概念一致 都是一组数据的逻辑表示 本质上就是一条 SELECT 语句的结果集 视图是纯粹的逻辑对象 没有关联的存储 Hive 3 0 0 引入的物化视图除外 当查询引用视图时
  • 三极管工作原理分析,精辟、透彻,看后你就懂

    说明 内容与之前那篇一样 由于之前那篇是转载百度的 现在图片受限 无法阅读 这篇自己添加了图片资源 随着科学技的发展 电子技术的应用几乎渗透到了人们生产生活的方方面面 晶体三极管作为电子技术中一个最为基本的常用器件 其原理对于学习电子技术的
  • 软件测试的原则和测试需求分析

    软件测试的原则 1 所有的测试都是以需求规格说明书为准的 2 软件测试必须基于 质量第一 的思想开展工作 如果时间与质量冲突 时间服从质量 3 事先定义好产品的质量标准 只要有了质量标准 才能根据测试结果 对产品质量进行分析和评估 4 软件
  • 蓝桥杯 基础练习 矩阵乘法

    问题描述 给定一个N阶矩阵A 输出A的M次幂 M是非负整数 例如 A 1 2 3 4 A的2次幂 7 10 15 22 输入格式 第一行是一个正整数N M 1 lt N lt 30 0 lt M lt 5 表示矩阵A的阶数和要求的幂数 接下
  • 国产代码审计工具Pinpoint介绍

    硬核国产代码审计工具Pinpoint介绍 简介 Pinpoint是由国内源伞科技所研制的一款静态代码审计工具 源伞科技公司是香港科技大学安全实验室的众多博士创建的 产品集成了实验室多年的研究成果 在众多国际顶级学术会议上都发表了成果论文 在
  • MinGW/GCC/CodeBlocks 等在 Win7 编译出现 Permission Denied 错误 - 解决方法

    本文分享了以 MinGW 为主要编译模块的编译器 如 MinGW 自身 以及Dev Cpp CodeBlocks 这些调用 MinGW 进行编译的编译器 在编译连接过程中出现 Permission Denied 错误的解决方法 同样 可能也
  • js搜索关键字,并高亮显示

    当我们搜索时 总想要自己输入的字体显示为重点 今天我为大家解决这个问题
  • 集成spring-boot-admin(一)搭建admin-server

    1 什么是SBA SBA全称为Spring Boot Admin 是一个管理和监控Spring Boot应用程序的开源项目 分为admin server 与 admin client 两个组件 admin server是一个单独的微服务 通
  • C++算术类型

    算术类型分为两类 整型 integral type 包含字符类型和布尔类型 和浮点型 算术类型的尺寸在不同机器有所差别 C 算术类型 类型 含义 最小尺寸 bit 字节 byte bool 布尔类型 未定义 1 char 字符型 8位 1
  • 不相交的线

    不相交的线 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数 现在 可以绘制一些连接两个数字 nums1 i 和 nums2 j 的直线 这些直线需要同时满足满足 nums1 i nums2 j 且绘制的直线不与任
  • 解决VirtualBox只能安装32位系统的问题

    安装VirtualBox虚拟机后发现只能安装32位系统 如下图 原因分析 电脑未开启cpu虚拟化技术 解决方式 需要到电脑BIOS里设置一下 方可安装 64位系统 操作方式 1 进入BIOS设置 根据电脑型号不同进入方式不一致 可网上查找进
  • 每天定时用爬虫爬取新闻发送给三爷

    需求 1 获取前十条科技要闻 2 通过邮件发送给指定收件人 3 定时发送 1 获取要闻 选的是新浪科技网https tech sina com cn 爬取前十名要闻 import requests from requests import
  • tensorlfow-yolov3训练

    本帖纯粹记录个人开发过程 服务器环境 V100服务器 ubuntu16 04 cuda10 0 tensorflow1 13 1 python3 5 tensorflow yolov3版本 https github com YunYang1
  • ThreadLocal理解及其内存泄露

    ThreadLocal理解及其内存泄露 ThreadLocal可以理解为 为一个线程隔离的变量 他不是一个集合 他只是一个类 这个类可以set get remove set时使用的是哪个线程 get时 也必需用哪个线程去获取 才能获取到值
  • 关于Proximal Methods,近端梯度下降的理解

    本文介绍了两种Proximal Methods的证明方法以及实现 内容主要来源于王然老师的 Proximal Methods 一文以及网络 加入了部分个人理解 由于水平有限 如有不妥之处 敬请指正 为什么会有Proximal methods
  • C语言之结构体(Struct)

    Struct 结构体的两种定义方法 方法1 方法2 结构体的成员的初始化与访问 应用举例 结构体的两种定义方法 方法1 定义一个结构体 struct Name int temp1 float temp2 1 1 定义一个结构体变量 stru
  • 拿offer必须掌握的最全SpringCloud面试题(含答案)

    今天公司的项目比较忙 远程开会和办公的沟通效率总是差那么一点 为了节约点时间 就不介绍SpringCloud了 我想只要是一名Java开发程序员 提到微服务 一定对SpringCloud的大名如雷贯耳 我们直接来看它的高频面试题吧 1 什么
  • R绘制双坐标轴

    目录 方法一 ggplot中的sec axis函数 方法二 plotrix包中的twoord plot 函数和twoord stackplot 函数 方法一 ggplot中的sec axis函数 ggplot2支持直接显示在辅助轴上的数据的