在R中的ggplot图表中添加插值的层

时间:2019-02-22 04:35:02

标签: r ggplot2 line-plot

我已经在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完全不同。

1 个答案:

答案 0 :(得分:1)

使用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

enter image description here

编辑:按对数刻度插值

或者,您可以使用对数转换后的输入进行插值,然后使用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))

这将导致以下结果:

enter image description here