Как нарисовать линейный график и игнорировать пропущенные значения в R

#r #na #missing-data #line-plot

#r #na #отсутствует-данные #линейный график

Вопрос:

У меня есть две переменные, которые я хочу отобразить в R, в одной из них (B) отсутствуют некоторые точки данных. Я хочу провести линию между существующими точками в B

Это изображение, которое я получаю от R R вывод

Я хочу соединить синие точки на 1, 5 и 10. Если я заменю NA нулями, я получу то же изображение, поскольку мой диапазон Y начинается с 1. И я не хочу, чтобы линия опускалась до нуля и ставила там точку.

Это код, который у меня есть до сих пор:

 A<-c(187.674646,101.734756,85.674646,57.327278,51.207435,49.438306,47.939082,44.17294,42.613277,39.916711)
B<-c(27.13350001,     NA   ,     NA   ,   NA   ,41.5181   ,     NA  ,     NA  ,   NA    ,  NA     ,79.18489934)

plot(A, type="o", pch=16, cex=1.5, lty=1, lwd=0.25,  col="red", ylim=graph_range, log="y", axes=FALSE, ann=FALSE)
axis(1, at=1:10, lab=c("1","2","3","4","5","6","7","8","9","10"),cex.axis=0.95, las=1)
yticks <-c(10,100,1000,10000)
axis(2, at=yticks, lab=c("10","100","1000","10000"),cex.axis=0.95)
box()
lines(B, type="o", pch=16, cex=1.5, lty=1, lwd =0.25, col="blue")
  

Ответ №1:

при построении графика вы всегда можете указать x- и y-координаты ваших точек, поэтому просто удалите NA из B и передайте x-координаты lines(), например:

 lines(c(1,5,10),B)
  

Помогает ли это?

Комментарии:

1. Или что-то вроде lines(which(!is.na(B)), na.omit(B)) .

2. Большое спасибо Доминику и @Axeman, оба метода сработали!

Ответ №2:

Чтобы иметь значения x вместе со значениями B, вы также можете поместить их все в data.frame и удалить строки с помощью NA:

 A<-c(187.674646,101.734756,85.674646,57.327278,51.207435,49.438306,47.939082,44.17294,42.613277,39.916711)
B<-c(27.13350001,     NA   ,     NA   ,   NA   ,41.5181   ,     NA  ,     NA  ,   NA    ,  NA     ,79.18489934)

df_B <- data.frame(x=seq_along(B),
                   B=B)
df_B_no_na <- na.omit(df_B)

df_B_no_na
#>     x       B
#> 1   1 27.1335
#> 5   5 41.5181
#> 10 10 79.1849
  

Затем вы можете просто построить график:

 plot(A, type="o", pch=16, cex=1.5, lty=1, lwd=0.25,  col="red",
     log="y", axes=FALSE, ann=FALSE, ylim=c(10, max(A)))
axis(1, at=1:10, lab=c("1","2","3","4","5","6","7","8","9","10"),cex.axis=0.95, las=1)
yticks <-c(10,100,1000,10000)
axis(2, at=yticks, lab=c("10","100","1000","10000"),cex.axis=0.95)
box()
lines(df_B_no_na, type="o",
      pch=16, cex=1.5, lty=1, lwd =0.25, col="blue")
  

Ответ №3:

Использование gglot2 и company может выглядеть следующим образом.

 library(dplyr)
library(ggplot2)

a <- c(187.674646,101.734756,85.674646,57.327278,51.207435,49.438306,47.939082,44.17294,42.613277,39.916711)
b <- c(27.13350001, NA, NA, NA, 41.5181, NA, NA, NA, NA, 79.18489934)

data <- tibble(A = a,
               B = b,
               C = c(which(!is.na(b)), rep(NA, 7)),
               D = c(b[!is.na(b)], rep(NA, 7)))

data %>%
  ggplot()  
  geom_point(aes(x = 1:nrow(data), y = A), color = 'red')  
  geom_line(aes(x = 1:nrow(data), y = A), color = 'red')    
  geom_point(aes(x = 1:nrow(data), y = B),  color = 'blue')  
  geom_line(aes(x = C, y = D),  color = 'blue')  
  scale_y_log10()  
  labs(x = NULL, y = NULL)  
  theme_minimal()  
  theme(panel.background = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_rect(colour = 'black', fill = NA, size = 1))
  

Что дает нам:

введите описание изображения здесь