首页 > 解决方案 > 当在 R 中插值时,在 ggplot 中对数变换后出现曲线

问题描述

我创建了以下数据框

library(data.table)
require(wrapr)
library(readxl)
library(dplyr)
library(tidyr)
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 = df$X_Frequency, y = df$X_Axis)) +  
  geom_line() +
  labs(x = "Frequency(Hz)", y="Axis")

B <- ggplotly(B, dynamicTicks = TRUE)
B <- layout(B, yaxis = list(type = "log"))
B <- layout(B, xaxis = list(type = "log"))

B

结果图显示了由直线分隔的各个点。我在点之间添加了插值,如下所示

接下来我们在可用点之间创建一个插值

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))
)

接下来我创建了一个包含所有插值的新数据框

df241 <- df_new %>% 
  left_join(df) %>% 
  fill(c(X_Slope2), .direction = 'up') ##fill up slopes

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]
  }
}

我们现在创建相同的情节

C <- ggplot(data = df241, 
            mapping = aes(x = df241$X_Frequency, y = df241$X_Axis)) +  
  geom_line() +
  labs(x = "Frequency(Hz)", y="Axis")
C <- ggplotly(C, dynamicTicks = TRUE)
C <- layout(C, yaxis = list(type = "log"))
C <- layout(C, xaxis = list(type = "log"))

C

虽然没有对数变换,两个图都是相同的,但使用对数变换,与没有插值的第一个图相比,第二个图(带有插值)显示曲线而不是直线。

是否可以在没有弯曲性质的情况下生成带有插值的线。该线应与图 B 相同,但将鼠标悬停在图上时应该可以看到插值。请求某人指导我。

标签: rggplot2linear-interpolationggplotly

解决方案


推荐阅读