Как построить две линии на одном графике, если количество наблюдений не одинаково? - PullRequest
0 голосов
/ 28 мая 2019

У меня есть два кадра данных, каждый из которых содержит столбец «Дата» и «Цена».Теперь я хочу создать график с двумя графиками на основе наблюдений за этими двумя кадрами данных.У меня проблема в том, что даты не совпадают.Мои данные выглядят так:

Date1 <- seq.Date(from = as.Date("2015-08-07"), to = as.Date("2015-08-16"), by = "days") 
Price1 <- c(2.5,6.3,1.2,2.4,4.2,5.1,7.3,9.2,12.5,8.7) 
df1 <- data.frame(Date1, Price1)

Date2 <- seq.Date(from=as.Date("2015-08-11"), to = as.Date ("2015-08-16"), by = "days") 
Price2 <- c(24.3,21.2,18.4,16.2,17.1,15.6) 
df2 <- data.frame(Date2, Price2)


df1
#         Date1 Price1
# 1  2015-08-07    2.5
# 2  2015-08-08    6.3
# 3  2015-08-09    1.2
# 4  2015-08-10    2.4
# 5  2015-08-11    4.2
# 6  2015-08-12    5.1
# 7  2015-08-13    7.3
# 8  2015-08-14    9.2
# 9  2015-08-15   12.5
# 10 2015-08-16    8.7


df2
#        Date2 Price2
# 1 2015-08-11   24.3
# 2 2015-08-12   21.2
# 3 2015-08-13   18.4
# 4 2015-08-14   16.2
# 5 2015-08-15   17.1
# 6 2015-08-16   15.6

Чтобы создать два графика на одном графике, я использую следующий код:

par(mar = c(5, 5, 9, 5))
plot(df1[,1],df1[,2], log = "y", type ="l", col = "orange")
par(new = TRUE)
plot(df2[,2],log = "y", type = "l",col = "blue")

Я хотел бы получить график, на которомСюжет из df1 начинается с начала, а df2 начинается в более поздний момент времени.

Спасибо!

Ответы [ 3 ]

0 голосов
/ 28 мая 2019

Проще добавить к основному графическому графику, используя lines(), а не par(add=TRUE).И при этом вы хотите убедиться, что первый график отображает весь диапазон значений, поэтому мы явно устанавливаем свойства xlim= и ylim=.

plot(df1[,1],df1[,2], log = "y", type ="l", col = "orange", 
     xlim=range(df1[,1], df2[,1]),
     ylim=range(df1[,2], df2[,2]))
lines(df2[,1], df2[,2], col = "blue")

enter image description here

0 голосов
/ 28 мая 2019

Если вас интересует подход из tidyverse:

df1 %>% 
full_join(df2, by = c("Date1" = "Date2")) %>% 
gather(key, value, -Date1) %>% 
ggplot(aes(x = Date1, y = value, group = key, col = key)) + 
geom_line()

Вот результат:

enter image description here

0 голосов
/ 28 мая 2019

Вы можете передать их в одном фрейме данных, чтобы длина дат была одинаковой:

df3 <- merge(df1, df2, by.x = 'Date1', by.y = 'Date2', all.x = TRUE)

А затем построите график, используя lines для наложения второй строки:

plot(df3$Date1, df3$Price1, type='l', col='blue', ylim = c(0, max(df3$Price2, na.rm = TRUE)))
lines(df3$Date1, df3$Price2, col='red')

Убедитесь, что вы добавили лимиты соответствующим образом, поскольку вызов сюжета устанавливает оси.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...