как R нанести дополнительные точки на график
Подскажите пожалуйста как нанести дополнительные точки(метки) на график?
# данные
a = c(641,642,642,642,640,639,640,641,640,640,640,639,638,645,649,641,647,655,660,667,660,662,665,669,680,683,673,675,685,690)
b = c( 1, NA, NA, NA, NA, -1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1, NA, NA, NA, -1, NA, NA, 1, NA, NA, NA, NA)
data = cbind(a,b)
a b
[1,] 641 1
[2,] 642 NA
[3,] 642 NA
[4,] 642 NA
[5,] 640 NA
[6,] 639 -1
[7,] 640 NA
[8,] 641 NA
[9,] 640 NA
[10,] 640 NA
# строим график по данным (a)
plot(a,t="l")
Как нанести точки(метки) на график из столбца (b)? Прикладываю график для примера.
Ответы (1 шт):
Автор решения: Artem Klevtsov
→ Ссылка
Для решения задачи достаточно разобраться с каким выходными данные работают функции plot и points. Им нужно передать координаты и дополнительные атрибуты.
Вектор b содержит в себе информацию о необходимости нанесения точки, а также о цвете. Сам координаты для точек береём из изначального вектора, а цвета из знака.
В решении ниже я переименовал входные данные для лучшего понимания смысла их использования при построении графика.
# кординаты Y
y <- c(641,642,642,642,640,639,640,641,640,640,640,639,638,645,649,641,647,655,660,667,660,662,665,669,680,683,673,675,685,690)
# кординаты X
x <- seq_along(y)
# разметка для нанесения точек
p <- c( 1, NA, NA, NA, NA, -1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1, NA, NA, NA, -1, NA, NA, 1, NA, NA, NA, NA)
# индекс непустых элементов
p_idx <- !is.na(p)
# построение граифка
plot(x = x, y = y, type = "l")
# нанесение точек
points(x = x[p_idx], y = y[p_idx], col = ifelse(p[p_idx] > 0, "green", "red"))
Решение на ggplot2:
y <- c(641,642,642,642,640,639,640,641,640,640,640,639,638,645,649,641,647,655,660,667,660,662,665,669,680,683,673,675,685,690)
x <- seq_along(y)
p <- c( 1, NA, NA, NA, NA, -1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1, NA, NA, NA, -1, NA, NA, 1, NA, NA, NA, NA)
DF <- data.frame(x, y)
DF$color <- ifelse(p > 0, "green", "red")
ggplot(DF, aes(x = x, y = y)) +
geom_line() + geom_point(data = DF[!is.na(DF$color), ], aes(color = color)) +
scale_colour_identity() +
theme_minimal()


