Как я могу получить свои точки для подключения на графике и показать тренд со значениями NA в данных? - PullRequest
0 голосов
/ 03 ноября 2018

У меня есть базовый набор данных, где я измеряю концентрацию в течение 24 месяцев. Некоторые месяцы не были выбраны, поэтому в моем списке 6 NA значений.

Функция na.omit() удаляет мои значения NA и дает мне график, который я ищу, но разрушает мою ось.


(1)

 plot(time, pt, type="o", pch=16, col="blue", 
    xlab="Time (months) relative to implant", ylab="Concentration (ng/ml)", 
    main="Concentration Overtime", 
    xaxt='n')
    axis(1, at=seq(-1, 24, by=1))

(2)

 plot(na.omit(pt), type="o", pch=16, col="blue", xlab="Time (months) relative 
        to implant", ylab="Concentration (ng/ml)", 
        main="Concentration Overtime", 
        xaxt='n')
        axis(1, at=seq(-1, 24, by=1))

Мой график выглядит так

Участок 1

output

Участок 2

output

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018
df <- data.frame(time=c(-1, 0, 1:24),
pt=c(7.0, 6.9, NA, 5.5, 5, 3, 14, NA, 23, NA, 14.5, 7, 9, NA, 11, 8, 5.2, 5.3, NA, 5, 3, NA, 1.5, NA, NA, 2))

png("test.png")
plot(pt~time, type="o", data=na.omit(data.frame(df)),
     pch=16, col="blue",
     xlab="Time (months) relative to implant",
     ylab="Concentration (ng/ml)",
     main="Concentration Overtime",
     xlim=c(-1, 24),
     xaxt='n')
axis(1, at=seq(-1, 24, by=1))
dev.off()

output

0 голосов
/ 03 ноября 2018

Используя данные из ответа Гванг-Джин Кима и предложение пунктирных линий, где существуют NA s, вот повтор. Я оставлю предыдущий ответ ниже.

lines (и, следовательно, plot(..., type="l")) требует, чтобы lty было одинаковым для всех компонентов, поэтому для получения пунктирных участков необходимо использовать segments для каждой точки-точка.

Для дополнительного кредита, я включаю красные точки вдоль оси X, где данные были отброшены в то время, когда существует значение NA.

df <- data.frame(time=c(-1, 0, 1:24),
                 pt=c(7.0, 6.9, NA, 5.5, 5, 3, 14, NA, 23, NA, 14.5, 7, 9, NA,
                      11, 8, 5.2, 5.3, NA, 5, 3, NA, 1.5, NA, NA, 2))
len <- nrow(df)
notna <- !is.na(df$pt)
df$dashes <- c(TRUE, !notna[-len])
df0 <- df[notna,]
len0 <- nrow(df0)

plot(pt ~ time, data=df0,
     type="p", pch=16, col="blue", 
     xlab="Time (months) relative to implant", ylab="Concentration (ng/ml)", 
     main="Concentration Overtime", 
     xaxt='n')
points(df$time, par('usr')[3] * is.na(df$pt), pch = 16, col = "red")
ign <- Map(segments, df0$time[-len0], df0$pt[-len0],
           df0$time[-1], df0$pt[-1],
           1, 1+df0$dashes[-1])
axis(1, at=seq(-1, 24, by=1))

plot


Вот предположение:

notna <- !is.na(pt)
plot(time[notna], pt[notna], type="o", pch=16, col="blue", 
    xlab="Time (months) relative to implant", ylab="Concentration (ng/ml)", 
    main="Concentration Overtime", 
    xaxt='n')
    axis(1, at=seq(-1, 24, by=1))

Одна проблема во втором коде

plot(na.omit(pt), ...)

означает, что вы не включили time, поэтому R естественным образом заполняется seq_along(na.omit(pt)) (почти так же, как 1:length(na.omit(pt))), что для вас приводит к потере time данных. Используя [notna] для поднабора обоих векторов, мы сохраняем данные, необходимые для построения графика.

...