使用ggplot()在同一个绘图上绘制多个时间序列

时间:2013-11-12 05:47:14

标签: r plot ggplot2

我是R的新手,我试图同时绘制两个时间序列线(当然使用不同的颜色),使用ggplot2。

我有2个数据框。第一个具有'X'和'日期'列的百分比变化。第二个也有'Y'和'Date'列的百分比变化,即两个都有一个'Date'列具有相同的值,而'Percent Change'列有不同的值。

我想在单个地块上使用ggplot2对“日期”(两者共有)绘制'百分比变化'列。

我在网上找到的例子使用了具有不同变量的相同数据框来实现这一点,我无法找到任何利用2个数据帧来绘制图的东西。我不想将两个数据框绑定在一起,我想将它们分开。这是我正在使用的代码:

ggplot(jobsAFAM, aes(x=jobsAFAM$data_date, y=jobsAFAM$Percent.Change)) + geom_line() +
  xlab("") + ylab("")

但是这段代码只生成一行,我想在它上面添加另一行。 任何帮助将非常感激。 TIA。

6 个答案:

答案 0 :(得分:87)

ggplot允许您拥有多个图层,这就是您应该利用的内容。

在下面创建的图中,您可以看到有两个geom_line语句命中每个数据集,并在一个图上绘制它们。如果要添加任何其他数据集,绘图甚至是图表的特征(如轴标签),则可以扩展该逻辑。

library(ggplot2)

jobsAFAM1 <- data.frame(
  data_date = runif(5,1,100),
  Percent.Change = runif(5,1,100)
)

jobsAFAM2 <- data.frame(
  data_date = runif(5,1,100),
  Percent.Change = runif(5,1,100)
)

ggplot() + 
  geom_line(data = jobsAFAM1, aes(x = data_date, y = Percent.Change), color = "red") +
  geom_line(data = jobsAFAM2, aes(x = data_date, y = Percent.Change), color = "blue") +
  xlab('data_date') +
  ylab('percent.change')

答案 1 :(得分:37)

如果两个数据框具有相同的列名,那么您应该在ggplot()调用中添加一个数据框,并在aes()调用的ggplot()内命名x和y值。然后为第一行添加第一个geom_line(),并使用geom_line()添加第二个data=df2调用(其中df2是您的第二个数据帧)。如果您需要使用不同颜色的线条,请在每个color=的{​​{1}}内添加aes()和eahc线的名称。

geom_line()

enter image description here

答案 2 :(得分:5)

我更喜欢使用ggfortify库。它是一个ggplot2包装器,用于识别autoplot函数内的对象类型,并选择最佳的ggplot方法进行绘制。至少我不必记住ggplot2的语法。

library(ggfortify)
ts1 <- 1:100
ts2 <- 1:100*0.8
autoplot(ts( cbind(ts1, ts2)  , start = c(2010,5), frequency = 12 ),
         facets = FALSE)

Plot

答案 3 :(得分:2)

我知道这已经过时但它仍然相关。您可以利用reshape2 :: melt将数据帧更改为ggplot2的更友好的结构。

优点:

  • 允许您绘制任意数量的行
  • 每条线都有不同的颜色
  • 为每行添加图例
  • 只有一次调用ggplot / geom_line

缺点:

  • 需要额外的包裹(reshape2)
  • 起初融化并不那么直观

例如:

jobsAFAM1 <- data.frame(
  data_date = seq.Date(from = as.Date('2017-01-01'),by = 'day', length.out = 100),
  Percent.Change = runif(5,1,100)
)

jobsAFAM2 <- data.frame(
  data_date = seq.Date(from = as.Date('2017-01-01'),by = 'day', length.out = 100),
  Percent.Change = runif(5,1,100)
)

jobsAFAM <- merge(jobsAFAM1, jobsAFAM2, by="data_date")

jobsAFAMMelted <- reshape2::melt(jobsAFAM, id.var='data_date')

ggplot(jobsAFAMMelted, aes(x=data_date, y=value, col=variable)) + geom_line()

enter image description here

答案 4 :(得分:0)

另一种方法是绑定数据帧,并为它们分配它们所代表的变量类型。这将允许您在tidier way

中使用完整数据集
library(ggplot2)
library(dplyr)

df1 <- data.frame(dates = 1:10,Variable = rnorm(mean = 0.5,10))
df2 <- data.frame(dates = 1:10,Variable = rnorm(mean = -0.5,10))

df3 <- df1 %>%
  mutate(Type = 'a') %>%
  bind_rows(df2 %>%
              mutate(Type = 'b'))


ggplot(df3,aes(y = Variable,x = dates,color = Type)) + 
  geom_line()

答案 5 :(得分:0)

这是旧的,只是更新上面没有提到的新的tidyverse工作流程。

var whereClause = (m => (m.Field != null && m.Field.Contains(searchValue)));
var data = dbSet.Where(whereClause);

@Chris Njuguna

tidyr :: gather()是tidyverse工作流程中的一个,它将宽数据帧转换为长整洁的布局,然后ggplot可以绘制多个序列。

gather