Как построить график в R с первыми значениями в одном цвете и следующими значениями в другом цвете? - PullRequest
1 голос
/ 22 февраля 2020

Я пробовал это, но не могу найти решение. Лучшее, что я могу сделать, - это построить первые 15846 значений в 1 цвете, а затем использовать функцию lines(), чтобы добавить оставшиеся 841 точку. Но затем они появляются в начале графика и не продолжаются с 15846-й точки данных.

str(as.numeric(sigma.in.fr))
 num [1:15846] 0.000408 0.000242 0.000536 0.000274 0.000476 ...

str(as.numeric(sigma.out.fr))
 num [1:841] 0.002558 0.000428 0.000255 0.000549 0.00028 ...

plot(as.numeric(sigma.in.fr),type="l",col=c("tomato4"))
lines(as.numeric(sigma.out.fr), type="l",col="tomato1")

Возвращает график ниже:

this plot]

Ответы [ 2 ]

2 голосов
/ 22 февраля 2020

Давайте создадим несколько фиктивных данных для демонстрации:

sigma.ins.fr = sin((1:800)/20) + rnorm(800)
sigma.outs.fr = sin((801:1000)/20) + rnorm(200)

Теперь соберите все данные в одну последовательность

sigma.all = c(sigma.ins.fr, sigma.outs.fr)

И создайте вектор x, который просто считает вдоль данные. Это понадобится нам при вызове segments ниже.

x = seq_along(sigma.all)

Теперь создайте вектор цветов для трассировки. Длина такой же, как у полных данных, с цветом для каждого сегмента.

cols = c(rep("tomato4", length(sigma.ins.fr)), rep("blue", length(sigma.outs.fr)))

Теперь создайте пустой холст для рисования данных.

plot(sigma.all, type="l", col=NA)

Наконец, мы можем построить данные. К сожалению, lines не допускает отдельный цвет в разных сегментах. Таким образом, вместо этого мы можем использовать segments

segments(head(x,-1), head(sigma.all,-1), x[-1], sigma.all[-1], type="l", col=cols)

enter image description here

Или, если вы действительно предпочитаете использовать две отдельные трассы, объединяя lines, тогда мы этого можно добиться, добавив координаты x к каждому вызову:

plot(sigma.all, type="l", col=NA)
lines(seq_along(sigma.ins.fr), sigma.ins.fr, col=c("tomato4"))
lines(seq_along(sigma.outs.fr) + length(sigma.ins.fr), sigma.outs.fr, col="tomato1")

enter image description here

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

Пожалуйста, предоставьте воспроизводимый пример. Используя пакеты ggplot2 и dplyr, вы можете сделать что-то вроде:

df <- tibble(x = seq(1,1000, 1), y = seq(1, 500.5, 0.5))


ggplot() +
  geom_line(data = df %>% filter(x < 800),
            aes(x = x, y = y), color = "red", size =2) +
  geom_line(data = df %>% filter(x >= 800), 
            aes(x = x, y = y),
            color = "black", size = 2)

enter image description here

Обратите внимание, что я отсекаю значение 800 ( как я только создал 1000 баллов), но вы можете легко изменить это.

Итак, что я делаю - это помещаю данные в geom_line, так как вы также можете использовать это, если у вас есть разные кадры данных (с перекрытием x и y), которые вы хотите отобразить на одном графике. Однако я фильтрую данные в разных точках, поэтому geom_line рисует разные линии.

...