47

我对 R 相当陌生,并且正在尝试使用 ggplot2 同时绘制两条时间序列线(当然使用不同的颜色)。

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

我想在单个图上使用 ggplot2 将“百分比变化”列与“日期”(两者通用)绘制出来。

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

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

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

4

6 回答 6

107

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')
于 2013-11-12T06:04:19.620 回答
44

如果两个数据框具有相同的列名,那么您应该在 call 中添加一个数据框,并在call 中ggplot()命名 x 和 y 值。然后首先为第一行添加第二个调用(其中 df2 是您的第二个数据框)。如果您需要不同颜色的线条,请在每个.aes()ggplot()geom_line()geom_line()data=df2color=aes()geom_line()

df1<-data.frame(x=1:10,y=rnorm(10))
df2<-data.frame(x=1:10,y=rnorm(10))

ggplot(df1,aes(x,y))+geom_line(aes(color="First line"))+
  geom_line(data=df2,aes(color="Second line"))+
  labs(color="Legend text")

在此处输入图像描述

于 2013-11-12T05:59:28.867 回答
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)

阴谋

于 2016-10-03T14:47:16.783 回答
5

我知道这是旧的,但它仍然是相关的。您可以利用 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()

在此处输入图像描述

于 2017-12-11T15:05:02.133 回答
3

这是旧的,只需更新上面未提及的新 tidyverse 工作流程。

library(tidyverse)

jobsAFAM1 <- tibble(
    date = seq.Date(from = as.Date('2017-01-01'),by = 'day', length.out = 5),
    Percent.Change = runif(5, 0,1)
    ) %>% 
    mutate(serial='jobsAFAM1')
jobsAFAM2 <- tibble(
    date = seq.Date(from = as.Date('2017-01-01'),by = 'day', length.out = 5),
    Percent.Change = runif(5, 0,1)
    ) %>% 
    mutate(serial='jobsAFAM2')
jobsAFAM <- bind_rows(jobsAFAM1, jobsAFAM2)

ggplot(jobsAFAM, aes(x=date, y=Percent.Change, col=serial)) + geom_line()

@Chris Njuguna

tidyr::gather() 是 tidyverse 工作流程中的一个,用于将宽数据帧转换为长而整齐的布局,然后 ggplot 可以绘制多个连续剧。

收集

于 2020-01-03T01:24:47.667 回答
1

另一种方法是绑定数据框,并为它们分配它们所代表的变量类型。这将使您以更整洁的方式使用完整的数据集

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()
于 2017-06-18T04:27:49.747 回答