【发布时间】: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")