Добавление слоя интерполированных значений на график ggplot в R - PullRequest
0 голосов
/ 22 февраля 2019

Я создал следующий фрейм данных в 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))

Теперь мы вычисляем интерполированные значения X-частоты, X_Axis из df_new, используя наклоны

       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 dataframe.но график выглядит очень отличающимся от исходного графика -B.

1 Ответ

0 голосов
/ 22 февраля 2019

Может быть проще использовать функцию 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

...