R语言 ggplot等值线图:使用辅助轴添加辅助数据集(点数据)

68de4m5k  于 2022-12-06  发布在  其他
关注(0)|答案(1)|浏览(160)

我已经在这个平台上阅读了许多其他类似的问题,非常接近解决这个问题,但仍然不能得到正确的代码。
我有一个带有反向y轴的等值线图。我想在等值线图上绘制第二个数据集的数据,使用带有对数刻度的次轴(因为我有很多接近0的数据,但也有一些更高的值)。重要的是,我不希望第二个轴是反向刻度的。
我想我已经有了几乎所有的代码“片段”,但我就是不知道如何合并它们。我展示了产生附图的主代码和我认为需要合并以回答我的问题的其他代码。
数据集#1是样品

如有必要,我可以提供。请注意,下图显示了绘制的结果

数据集#2是毒素

X轴-与Month_Day_Revised_Fake等值线图相同

1.4
1.8
2.2
2.6
3
3.4
3.8
4.2
4.6
5

y轴(希望此对数刻度与次轴不像主y轴那样反向刻度)。

0.29
0.05
0.05
0.24
62.01
12.84
29.84
269.57
3.64
2.78

我已使用此问题中的代码覆盖第二个数据集(Toxin)。How can I overlay points and lines onto a contour plot with ggplot2?
下面是我将添加到数据集中的代码。

geom_point(data = Toxin, aes(x = `Month_Day_Revised_Fake, y = Toxin), pch = 21) +`

我已经用代码添加了一个辅助轴,但不知道如何将其与反向y轴结合起来。也读过几个关于使其成为对数轴的线程,但都没有成功。

scale_y_continuous(
    sec.axis = sec_axis(trans=~.*50)

这是我用来生成图的代码。

Sample<- read.csv('chl_revised_stopub.csv',header=TRUE, blank.lines.skip = TRUE,na.strings = "NA",stringsAsFactors=FALSE); 

mba <- mba.surf(Sample[,c('Month_Day_Revised_Fake', 'Depth_m', 'Temperature_C')], 100, 100)

dimnames(mba$xyz.est$z) <- list(mba$xyz.est$x, mba$xyz.est$y)

SampleMelt <- melt(mba$xyz.est$z, varnames = c('Month_Day_Revised_Fake', 'Depth_m'), value.name = 'Temperature_C')

themebox <- function(base_family = "sans", ...){
  theme_bw(base_family = base_family, ...) +
    theme( plot.title = element_text(color="#000000",size = 14,  face = "bold"),
           axis.title.x = element_text(colour = "#000000", family="sans",size=10),
           axis.title.y = element_text(colour = "#000000", family="sans", size=10),
           axis.text.x = element_text(color="#000000", size=9, family="sans", face = 
                                        "bold"),
           axis.text.y = element_text(color="#000000", size=10, family="sans", face = "bold"))}

Fig <-
  ggplot(data=SampleMelt, aes(Month_Day_Revised_Fake, Depth_m))+
  geom_raster(aes(fill = Temperature_C), interpolate = F, hjust = 0.5, vjust = 0.5) +  #Temperature_C, DO_mg.L
  geom_contour(aes(z = Temperature_C)) +  #Temperature_C, DO_mg.L +
  theme(axis.text.x = element_text(face="bold", angle = 45,hjust = 1)) +
  scale_x_continuous(guide = guide_axis(angle = 50), expand = expansion(0),limits=c(1.4,5.4), breaks=c(1.4,1.8,2.2,2.6,3.0,3.4,3.8,4.2,4.6,5,5.4),labels=c("1.4" = "May 26", "1.8" = "June 13","2.2" = "June 23", "2.6"="July 6", "3" = "July 21", "3.4" = "Aug 9", "3.8" = "Aug 24", "4.2" = "Sep 20", "4.6" = "Sep 30", "5" = "Oct 18", "5.4" = "Nov 14"))+
  scale_y_reverse(expand = expansion(0), breaks=c(0,1.0,2.0,3.0,4.0)) +
    scale_fill_gradientn(colours=matlab.like2(7),limits=c(0,22),breaks=c(0,5,10,15,20,22), name="Chl (\U003BCg/L)")+    
  
  xlab("Public Dock")+
  ylab("Water Depth (m)")+
  themebox()
Fig

n8ghc7c1

n8ghc7c11#

关于二级音阶,您需要:

  • 从次要值到主要标度的(向前)转换
  • 从主值到次值的逆变换

在这里,我们将使用log10变换和一个逆变换(撤销主逆变换),然后是缩放和平移步骤。在sec_axis()函数中,我们提供了这个逆变换。
使用虚拟数据和内置数据集:

library(ggplot2)
library(scales)

# Some data that can be used for contours and such
volc <- reshape2::melt(volcano)

# Dummy data for secondary axis
sec <- data.frame(
  Var1 = runif(100, min(volc$Var1), max(volc$Var1)),
  Var2 = rlnorm(100, meanlog = 0.1)
)

# Parameters for our forward transformation
trans <- compose_trans("log10", "reverse") # free inverse transform
scale <- 20
translate <- 25

ggplot(volc, aes(Var1, Var2)) +
  geom_raster(aes(fill = value)) +
  geom_contour(aes(z = value), colour = "black") +
  geom_point(
    data = sec,
    # Apply forward transformation to data values
    aes(y = trans$transform(Var2) * scale + translate),
    colour = "red"
  ) +
  scale_y_reverse(
    sec.axis = sec_axis(
      # Apply inverse transformation to secondary scale
      ~ trans$inverse((.x - translate) / scale),
      breaks = scales::log_breaks()
    )
  )

reprex package(v2.0.1)于2022年11月29日创建

相关问题