通过绘制来自同一 data.frame 的多个组、区域和来源的每小时数据来创建多个折线图?
Create multiple line graphs by Plotting hourly data for multiple groups, zones & sources from same data.frame?
我正在尝试使用 R 中的单个或最小命令创建多个图[一次 6 个或更多图]。
我们先来看每小时的数据:-
str(ZZZ)
'data.frame': 291960 obs. of 9 variables:
$ TRADE_DT : POSIXct, format: "2014-11-01" "2014-11-01" "2014-11-01" "2014-11-01" ...
$ YEAR : int 2014 2014 2014 2014 2014 2014 2014 2014 2014 2014 ...
$ MONTH : int 11 11 11 11 11 11 11 11 11 11 ...
$ hour_num : int 1 1 1 1 1 1 1 1 1 1 ...
$ source : Factor w/ 5 levels "AB","EF","EI",..: 1 1 1 1 1 1 1 1 1 1 ...
$ LSE_CD : int 116 116 116 116 116 116 135 135 135 135 ...
$ utility_cd: Factor w/ 6 levels "CPL","SHARY",..: 1 2 3 4 5 6 1 4 5 6 ...
$ load : num 12.834 0.502 31.436 13.948 31.314 ...
$ total_load: num 13.929 0.524 35.864 14.77 33.161 ...
dput(头(ZZZ))
structure(list(TRADE_DT = structure(c(1414818000, 1414818000,
1414818000, 1414818000, 1414818000, 1414818000), class = c("POSIXct",
"POSIXt"), tzone = ""), YEAR = c(2014L, 2014L, 2014L, 2014L,
2014L, 2014L), MONTH = c(11L, 11L, 11L, 11L, 11L, 11L), hour_num = c(1L,
1L, 1L, 1L, 1L, 1L), source = structure(c(1L, 1L, 1L, 1L, 1L,
1L), .Label = c("AB", "EF", "EI", "IB", "ST"), class = "factor"),
LSE_CD = c(116L, 116L, 116L, 116L, 116L, 116L), utility_cd = structure(1:6, .Label = c("CPL",
"SHARY", "TNMP", "TXRL", "TXTU", "WTU"), class = "factor"),
load = c(12.83423, 0.501589, 31.435567, 13.947688, 31.314148,
2.237439), total_load = c(13.928702, 0.524432, 35.864181,
14.770245, 33.161105, 2.417721)), .Names = c("TRADE_DT",
"YEAR", "MONTH", "hour_num", "source", "LSE_CD", "utility_cd",
"load", "total_load"), row.names = c(NA, 6L), class = "data.frame")
我有兴趣根据每个实用程序叠加我的来源(AB、EI、EF 等....)。对于 6 个实用程序,它应该生成 6 个图表,其中每个图表将有 5 条线(或 2 条或 3 条线,如有必要)。 每个实用程序 1 个图表,每个图表应根据来源有多行。
听起来很简单,但当数据采用这种格式时我无法实现它。
我能够在图表中叠加多条线...
然而,当我将我的资源(5 个因素)变成 5 个不同的列并从图片中删除 HOUR 并每天对其求和时,我能够实现它。
str(YYY)
'data.frame': 102 obs. of 5 variables:
$ TRADE_DT: POSIXct, format: "2014-01-01" "2014-01-02" "2014-01-03" ...
$ AB : num 289 336 356 258 316 ...
$ EI : num 306 347 370 282 335 ...
$ IB : num 282 325 299 250 307 ...
$ EF : num 304 348 367 281 335 ...
ggplot(YYY, aes(TRADE_DT)) +
geom_line(aes(y = AB, colour = "AB")) +
geom_line(aes(y = EI, colour = "EI")) +
geom_line(aes(y = IB, colour = "IB")) +
geom_line(aes(y = EF, colour = "EF"))
但是,上面的方法并没有按照我的要求用 utility_cd 或 LSE_cd 分隔图表,而且我不得不去掉小时。我看到有人在 SAS 中使用“by command”一次创建这些多个图形。
R 中是否有针对此类交易的神奇“命令”?我会把我所有的图表输出到一个大的 pdf 文件中,我可以自己处理。
如果有人可以分享根据这些标准生成多个图表的秘密,我将不胜感激。另外,当我有 24 小时数据时,这条线看起来不像线,它们看起来像是通过一条倾斜的水平线相互连接。
再次感谢!
最好的,
盖夫
请提供 dput(head(YOUR DATA SET))
而不是 str
,因为 str
不太适合重现您的数据。 How to make a great R reproducible example?
希望对您有所帮助:
1。绘制数据
对于 ggplot
你需要 molten 数据集 reshape2-package
获取第二个数据集:
YYY <- data.frame(TRADE_DT = seq(as.Date("2014-01-01"),as.Date("2014-01-05"), length.out = 5),
AB = c(289,336,356,258,316),
EI = c(306,347,370,282,335),
IB = c(282,325,299,250,307),
EF = c(304,348,367,281,335))
现在我们使用 melt
将其塑造成我们的需要:
require(reshape2)
YYY_molten <- melt(YYY,"TRADE_DT")
> head(YYY_molten)
TRADE_DT variable value
1 2014-01-01 AB 289
2 2014-01-02 AB 336
3 2014-01-03 AB 356
4 2014-01-04 AB 258
5 2014-01-05 AB 316
6 2014-01-01 EI 306
现在您可以使用ggplot
require(ggplot2)
ggplot(YYY_molten, aes(x = TRADE_DT, y = value, col = variable)) + geom_line()
2。按实用程序绘图
假设 _utility_cd_ 是包含实用程序数据的列,您可以执行以下操作:
ZZZ_split <- split(ZZZ, f = ZZZ$utility_cd)
lapply(ZZZ_split, function(subset){
# function that melts and plots your subset/utility
})
如果我对你的 str 的理解正确,它应该是:
lapply(ZZZ_split, function(subset){
print(ggplot(subset, aes(x=TRADE_DT, y=LSE_CD, col = source)) + geom_line())
})
我正在尝试使用 R 中的单个或最小命令创建多个图[一次 6 个或更多图]。
我们先来看每小时的数据:-
str(ZZZ)
'data.frame': 291960 obs. of 9 variables:
$ TRADE_DT : POSIXct, format: "2014-11-01" "2014-11-01" "2014-11-01" "2014-11-01" ...
$ YEAR : int 2014 2014 2014 2014 2014 2014 2014 2014 2014 2014 ...
$ MONTH : int 11 11 11 11 11 11 11 11 11 11 ...
$ hour_num : int 1 1 1 1 1 1 1 1 1 1 ...
$ source : Factor w/ 5 levels "AB","EF","EI",..: 1 1 1 1 1 1 1 1 1 1 ...
$ LSE_CD : int 116 116 116 116 116 116 135 135 135 135 ...
$ utility_cd: Factor w/ 6 levels "CPL","SHARY",..: 1 2 3 4 5 6 1 4 5 6 ...
$ load : num 12.834 0.502 31.436 13.948 31.314 ...
$ total_load: num 13.929 0.524 35.864 14.77 33.161 ...
dput(头(ZZZ))
structure(list(TRADE_DT = structure(c(1414818000, 1414818000,
1414818000, 1414818000, 1414818000, 1414818000), class = c("POSIXct",
"POSIXt"), tzone = ""), YEAR = c(2014L, 2014L, 2014L, 2014L,
2014L, 2014L), MONTH = c(11L, 11L, 11L, 11L, 11L, 11L), hour_num = c(1L,
1L, 1L, 1L, 1L, 1L), source = structure(c(1L, 1L, 1L, 1L, 1L,
1L), .Label = c("AB", "EF", "EI", "IB", "ST"), class = "factor"),
LSE_CD = c(116L, 116L, 116L, 116L, 116L, 116L), utility_cd = structure(1:6, .Label = c("CPL",
"SHARY", "TNMP", "TXRL", "TXTU", "WTU"), class = "factor"),
load = c(12.83423, 0.501589, 31.435567, 13.947688, 31.314148,
2.237439), total_load = c(13.928702, 0.524432, 35.864181,
14.770245, 33.161105, 2.417721)), .Names = c("TRADE_DT",
"YEAR", "MONTH", "hour_num", "source", "LSE_CD", "utility_cd",
"load", "total_load"), row.names = c(NA, 6L), class = "data.frame")
我有兴趣根据每个实用程序叠加我的来源(AB、EI、EF 等....)。对于 6 个实用程序,它应该生成 6 个图表,其中每个图表将有 5 条线(或 2 条或 3 条线,如有必要)。 每个实用程序 1 个图表,每个图表应根据来源有多行。 听起来很简单,但当数据采用这种格式时我无法实现它。
我能够在图表中叠加多条线...
然而,当我将我的资源(5 个因素)变成 5 个不同的列并从图片中删除 HOUR 并每天对其求和时,我能够实现它。
str(YYY)
'data.frame': 102 obs. of 5 variables:
$ TRADE_DT: POSIXct, format: "2014-01-01" "2014-01-02" "2014-01-03" ...
$ AB : num 289 336 356 258 316 ...
$ EI : num 306 347 370 282 335 ...
$ IB : num 282 325 299 250 307 ...
$ EF : num 304 348 367 281 335 ...
ggplot(YYY, aes(TRADE_DT)) +
geom_line(aes(y = AB, colour = "AB")) +
geom_line(aes(y = EI, colour = "EI")) +
geom_line(aes(y = IB, colour = "IB")) +
geom_line(aes(y = EF, colour = "EF"))
但是,上面的方法并没有按照我的要求用 utility_cd 或 LSE_cd 分隔图表,而且我不得不去掉小时。我看到有人在 SAS 中使用“by command”一次创建这些多个图形。
R 中是否有针对此类交易的神奇“命令”?我会把我所有的图表输出到一个大的 pdf 文件中,我可以自己处理。
如果有人可以分享根据这些标准生成多个图表的秘密,我将不胜感激。另外,当我有 24 小时数据时,这条线看起来不像线,它们看起来像是通过一条倾斜的水平线相互连接。
再次感谢!
最好的, 盖夫
请提供 dput(head(YOUR DATA SET))
而不是 str
,因为 str
不太适合重现您的数据。 How to make a great R reproducible example?
希望对您有所帮助:
1。绘制数据
对于 ggplot
你需要 molten 数据集 reshape2-package
获取第二个数据集:
YYY <- data.frame(TRADE_DT = seq(as.Date("2014-01-01"),as.Date("2014-01-05"), length.out = 5),
AB = c(289,336,356,258,316),
EI = c(306,347,370,282,335),
IB = c(282,325,299,250,307),
EF = c(304,348,367,281,335))
现在我们使用 melt
将其塑造成我们的需要:
require(reshape2)
YYY_molten <- melt(YYY,"TRADE_DT")
> head(YYY_molten)
TRADE_DT variable value
1 2014-01-01 AB 289
2 2014-01-02 AB 336
3 2014-01-03 AB 356
4 2014-01-04 AB 258
5 2014-01-05 AB 316
6 2014-01-01 EI 306
现在您可以使用ggplot
require(ggplot2)
ggplot(YYY_molten, aes(x = TRADE_DT, y = value, col = variable)) + geom_line()
2。按实用程序绘图
假设 _utility_cd_ 是包含实用程序数据的列,您可以执行以下操作:
ZZZ_split <- split(ZZZ, f = ZZZ$utility_cd)
lapply(ZZZ_split, function(subset){
# function that melts and plots your subset/utility
})
如果我对你的 str 的理解正确,它应该是:
lapply(ZZZ_split, function(subset){
print(ggplot(subset, aes(x=TRADE_DT, y=LSE_CD, col = source)) + geom_line())
})