Используя данные из ответа Гванг-Джин Кима и предложение пунктирных линий, где существуют 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))
Вот предположение:
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]
для поднабора обоих векторов, мы сохраняем данные, необходимые для построения графика.