将插值层添加到 R 中的 ggplot 图表

Adding layer of interpolated values to ggplot chart in R

我在 R 中创建了以下数据框以使用 ggplot 生成绘图

 library(data.table)
 library(ggplot2)
 library(plotly)

     df <- data.frame("X_Frequency" = c(5, 10, 55, 180, 300, 360, 1000, 2000) 
       , "X_Axis" = c(0.009185742, 0.207822221, 0.067542222, 0.002597778, 
       0.002597778, 0.001454756, 0.001454756 , 0.001454756))

接下来我使用 ggplot

生成了一个图
        B <- ggplot(data = df, 
        mapping = aes(x = X_Frequency, y = X_Axis)) +  
        geom_line() + labs(x = "Frequency(Hz)", y="Axis")

        B <- ggplotly(B, dynamicTicks = TRUE)###Hovering enabled
        B <- layout(B, yaxis = list(type = "log"))##X Y log scales enabled
        B <- layout(B, xaxis = list(type = "log"))

        B

我创建了以下数据帧 df241,其中包含 df1 中各种观察值之间的插值。首先我们创建斜坡

   df$X_Slope2 <- 0### Initiate slope column
   for(i in 2:nrow(df)){
   df$X_Slope2[i] = (df$X_Axis[i] - df$X_Axis[i-1]) / 
   (df$X_Frequency[i] - df$X_Frequency[i - 1])
                                     }

接下来我们将各自的斜率分配给所有值

     df_new <- bind_cols(df %>%
     select(X_Frequency, X_Axis, X_Slope2) %>%
     complete(., expand(., X_Frequency = 5:2000))

现在我们使用斜率

从df_new计算X频率的内插值X_Axis
       for(i in 1: nrow(df241)){
       if(is.na(df241$X_Axis[i]) == T){
       df241$X_Axis[i] = df241$X_Slope2[i] * 
       (df241$X_Frequency[i] - df241$X_Frequency[i-1]) +
       df241$X_Axis[i-1]  } else {
       df241$X_Axis[i] = df241$X_Axis[i]}} 

我想将这些来自 df241 的内插值放在上面生成的原始图表 B 上。这怎么可能实现。我请求有人帮助我。

注意:我尝试生成一个基于 df_new 数据框的新绘图。但图表看起来与原始图表 -B 大不相同。

使用 approx 函数进行插值可能更简单。我相信这会得到与您的插值步骤相似的结果。

df_interp <- approx(df$X_Frequency, df$X_Axis, xout = 5:2000) %>%
  as_tibble() %>%
  rename(X_Frequency = x, X_Axis = y)

线性插值在对数对数尺度上可能看起来出乎意料。我无法 运行 您提供的代码(df241 是在某处创建的吗?),所以我不确定这是否是您所说的带有内插值的图表看起来非常不同时遇到的情况。

B <- ggplot(data = df, 
            mapping = aes(x = X_Frequency, y = X_Axis)) +  
  geom_line() + 
  geom_point(data = df_interp, size = 0.1, color = "blue") +
  labs(x = "Frequency(Hz)", y="Axis")
B <- ggplotly(B, dynamicTicks = TRUE)###Hovering enabled
B <- layout(B, yaxis = list(type = "log"))##X Y log scales enabled
B <- layout(B, xaxis = list(type = "log"))
B

编辑:对数刻度插值

或者,您可以使用对数转换输入进行插值,然后使用 exp 转换回原始比例:

df_interp <- approx(log(df$X_Frequency), log(df$X_Axis), xout = log(5:2000)) %>%
  as_tibble() %>%
  mutate(X_Frequency = exp(x),
         X_Axis = exp(y))

这会导致: