【问题标题】:Cannot add series to plot无法将系列添加到绘图
【发布时间】:2017-06-30 23:50:50
【问题描述】:

我需要帮助来制作一个非常简单的情节。它只是一个折线图,带有一组不同价格的伴随线(它们都是时间序列,每种商品都有一条线。X = 价格,Y = 时间)。所以我有一个遵循以下格式的数据集:

#Date    prices1   prices2

日期均遵循 YYYY-MM-DD 格式,两列价格均为数字。我已经检查了所有三列的类,以确保它们是它们应该是的(分别为“Date”、“numeric”和“numeric”)。还有一些我觉得我应该提到的事情:

  • 数据是通过 Quandl() 调用检索的,并且初始数据帧的长度不同。因此,我不得不使用 full_join 加入他们。我仍然检查了最终数据框中每一列的 class(),它们是正确的。

  • price1 列的长度为 91,而price2 列的长度为 100。我最初认为这是问题的根源。但是在设置了 df$price2[92:100] = NA 之后,我仍然有同样的问题(我可以分别绘制每条线,但是当我使用 lines() 函数时都不会出现)。

  • 1234563 .

现在,我没有将它们设为时间序列对象,而是尝试将它们简单地绘制为普通数据框。我可以自己绘制 他们两个 ,但我不能为我的一生绘制一个并为另一个使用 lines() 函数。我会错过什么?如果NA 是问题所在,那么为什么我无法使用 Quandl 数据绘制两线图,而我的测试数据却很好?

由于问题的情况,我决定共享 Quandl 脚本和测试脚本。

#Original Script with issues
#Retrieving Data1
library(dplyr)
library(zoo)
library("Quandl")

data.1 = Quandl("JODI/OIL_TCPRKL_VEN")
#Putting data in chronological order

      #not in order
      print(data.1$Date[1])
      print(data.1$Date[length(data.1$Date)])

data.1 = data.frame(
  data.1$Date[length(data.1$Date):1],
  data.1$Value[length(data.1$Value):1]
)
names(data.1) = c("Date", "Value1")

      #Now in order
      print(data.1$Date[1])
      print(data.1$Date[length(data.1$Date)])





#Retrieving data2
data.2 = Quandl("JODI/OIL_TCPRKB_IRQ")

      #not in order
      print(data.2$Date[1])
      print(data.2$Date[length(data.2$Date)])

data.2 = data.frame(
  data.2$Date[length(data.2$Date):1],
  data.2$Value[length(data.2$Value):1]
)
names(data.2) = c("Date", "Value2")

      #now in order 
      print(data.2$Date[1])
      print(data.2$Date[length(data.2$Date)])


#join the data
data.join = data.frame(full_join(data.1, data.2))


plot(data.join$Date, data.join$Value1,
     col = "blue",
     main = "Should have both lines",
     type = "l",
     sub = "only one of them shows up though. Why?",
     xlab = "Date",
     ylab = "Values")
lines(data.join$Value2)
#plot only has one line. Why??

这也是我制作的一个测试脚本,我似乎没有遇到问题。

library(dplyr)
library(zoo)


time.a = as.Date(c(10:30))
time.b = as.Date(c(20:40))
time.c = as.Date(c(30:50))

value.a = as.numeric(seq(10,30,1))
value.b = as.numeric(seq(20,60,2))
value.c = as.numeric(seq(20,30,.5))

    length(time.a)
    length(time.b)
    length(time.c)

    length(value.a)
    length(value.b)
    length(value.c)


    print(time.a)
    print(time.b)
    print(time.c)

    print(value.a)
    print(value.b)
    print(value.c)



data.a = data.frame(time.a, value.a)
data.b = data.frame(time.b, value.b)
data.c = data.frame(time.c, value.c)

names(data.a) = c("Date", "Value.a")
names(data.b) = c("Date", "Value.b")
names(data.c) = c("Date", "Value.c")

all.data = full_join(data.a, data.b)
all.data = full_join(all.data, data.c)


plot(all.data$Date, all.data$Value.a,
     type = "l",
     main = "plot",
     xlab = "Date",
     ylab = "Values")

lines(all.data$Date, all.data$Value.b,
      col = "blue")


lines(all.data$Date, all.data$Value.c,
      col = "red")

我真的想了解为什么第一个脚本不起作用,而我的第二个脚本起作用。任何帮助或提示将不胜感激。 Why doesn't it work?

【问题讨论】:

  • 它们在同一个范围内吗?您的第一个 plot 调用将定义 y 轴的范围。默认情况下,它将适合您的 y 值。例如,如果您的第一个系列的值介于 1 和 10 之间,而您的第二个系列的值介于 50 和 70 之间,则它将超出范围并且不会显示。您可以在 plot() 调用中指定 ylim 以覆盖默认值。
  • @Gregor 我也考虑过这一点。我使用了 range 函数,这就是我分别得到的。 range(na.omit(data.join$Value1)) [1] 11275.4 15071.7 range(data.join$Value2) [1] 62440 151621 我在设置范围时还检查了图形。尽管如此,线条并没有出现。
  • 您将范围设置为什么,因为这些范围远未重叠?看起来这可能确实是问题所在。一般的方式是设置ylim = c(min(c(data.join$Value1, data.join$Value2), na.rm = T), max(c(data.join$Value1, data.join$Value2), na.rm = T))
  • 如果您需要更多帮助,我鼓励您制作一个minimal 示例。我和许多其他人都不愿意为了一个简单的绘图问题而费尽心思安装 Quandl、下载数据并按照您的数据操作步骤进行操作。与其共享 50 行代码来创建和处理数据,您应该只以复制/可粘贴格式共享最终数据:dput(droplevels(head(join.data[c("Date", "Value1", "Value2")])))。 See here for more tips
  • @Gregor 我明白了。我用了你上面的公式。这是我得到的输出。我不太确定我在看什么。它显示了一些值,但不显示整个数据框。 :structure(list(Date = structure(c(14275, 14303, 14334, 14364, 14395, 14425), class = "Date"), Value1 = c(14347.197, 12856.3706, 14623.1995, 13998.8553, 14381.6974, 13688.8295), Value2 = c(68603, 62440, 73439, 69930, 72850, 73500)), .Names = c("Date", "Value1", "Value2"), row.names = c(NA, 6L), class = "data.frame")

标签: r plot dplyr lines zoo


【解决方案1】:

你的问题是 y 范围。

使用您的样本数据:

df = structure(list(Date = structure(c(14275, 14303, 14334, 14364, 14395,
 14425), class = "Date"), Value1 = c(14347.197, 12856.3706, 14623.1995,
 13998.8553, 14381.6974, 13688.8295), Value2 = c(68603, 62440, 73439,
 69930, 72850, 73500)), .Names = c("Date", "Value1", "Value2"), row.names = 
 c(NA, 6L), class = "data.frame")

我们可以看到范围远没有重叠,因此您需要预先定义绘图的范围:

df_range = range(c(df$Value1, df$Value2), na.rm = T)
plot(df$Date, df$Value1, type = "l", ylim = df_range))
lines(df$Date, df$Value2, col = "firebrick4")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-03
    • 2021-06-05
    • 2018-04-04
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    • 2023-03-22
    相关资源
    最近更新 更多