使用与R中数据帧中多个时间序列的最新日期相对应的值创建条形图

使用与R中数据帧中多个时间序列的最新日期相对应的值创建条形图,r,plot,time-series,bar-chart,R,Plot,Time Series,Bar Chart,我有一个数据框,第一列是日期,其余是值。数据帧的结构采用以下形式: Data <- data.frame(Date = c("2017-06-30","2017-06-29","2017-06-28","2017-06-27"), TS1 = c(1,2,3,4), TS2 = c(5,6,7,8), TS3 =c(9,10,11,12)) 数据关于最后一个日期2017-06-30,您可以做(逐步): 数据跟进我的评论: barplot(t(Dat

我有一个数据框,第一列是日期,其余是值。数据帧的结构采用以下形式:

Data <- data.frame(Date = c("2017-06-30","2017-06-29","2017-06-28","2017-06-27"), 
                   TS1 = c(1,2,3,4), TS2 = c(5,6,7,8), TS3 =c(9,10,11,12))

数据关于最后一个日期2017-06-30,您可以做(逐步):


数据跟进我的评论:

barplot(t(Data[,2:4]), col=c("red","lightblue","gray"), 
    beside = T, las=3, 
    names.arg=Data[order(as.Date(as.character(Data[,1]), "%Y-%m-%d")),1], las=1)

如果您只需要最后一次输入:

barplot(t(Data[nrow(Data),2:4]), col=c("red","lightblue","gray"), 
    beside = T, las=3, 
    names.arg=Data[order(as.Date(as.character(Data[,1]), "%Y-%m-%d")),1][nrow(Data)],las=1)

说明:

末端的
las=1
使标签水平

order(as.Date(as.character(Data[,1]),%Y-%m-%d)),1
这将在第一列中给出日期的有序索引,我们使用该索引获取排序标签进行打印

nrow(Data)
在第一行和第三行中指向最后一个条目

next=T
将它们绘制在一个组中

更新: 回答OP在评论中的问题:“是否有一种简单的方法可以在每个条下显示时间序列名称(本例中为TS1、TS2、TS3),而不是整个轴的日期以及条上的值?”

可以根据需要定义轴。下面是一个满足您需求的示例:

barplot(t(Data[nrow(Data),2:4]), col=c("red","lightblue","gray"), 
        beside = T, axes=FALSE, xaxt="n") #plot with no axis
axis(2,0:12,las=2)    #y-axis
axis(1,2.5,line=2, las=1,
     labels =Data[order(as.Date(as.character(Data[,1]), "%Y-%m-%d")),1][nrow(Data)]) #x-axis with the date as the label in the second(3rd) line
axis(1,1:3+0.5,line=0, las=1,
     labels =colnames(Data[2:ncol(Data)])) #x-axis with time series names
text(x = 1:3+0.5, y = Data[nrow(Data),2:4], label = Data[nrow(Data),2:4], 
 pos = 3, cex = 0.8, col = "red", xpd=TRUE) # add the values as text to the plot

带有
ggplot2的解决方案

require(ggplot2)
require(reshape2)

df1 <- melt(Data, "Date")

g1 <- ggplot(subset(df1, Date>=as.Date("2017-06-30")), aes(x=Date, y=value))+
  geom_bar(aes(fill=variable), stat="identity", position="dodge")+
  theme_bw()
require(ggplot2)
要求(2)

df1
barplot(t(Data[,2:4]),col=c(“红色”、“浅蓝色”、“灰色”),旁边是=t,las=3,names.arg=Data[,1],las=1)
太好了,谢谢!是否有一种简单的方法可以在每个条形图下方显示时间序列名称(本例中为TS1、TS2、TS3),而不是显示整个轴的日期以及条形图上方的值?再次感谢你!c、 我据此调整了答案,你不觉得答案错了吗?因为您还对值进行了排序,而OP希望最后一行的值带有最后一个日期。上面说的日期2017-06-30又称最后一个日期,这就是我所说的,该日期的数据是1,5,9。我说得对吗?@Masoud:非常仔细,但事实上,原始文件中的日期是按升序排列的,所以解决方案非常完美。谢谢你,@Patrik\u P!太好了,谢谢!一个非常清晰和直接的解决方案!是否有一种简单的方法可以在每个条形图下方显示时间序列名称(本例中为TS1、TS2、TS3),而不是显示整个轴的日期以及条形图上方的值?再次感谢你!c、 啊,好的,谢谢你的提示,我会的!我可以问最后一个问题吗:为什么上面图表中的值与相应的日期不匹配?我刚刚意识到4-8-12是2017-06-27,如果我没弄错的话…@cthulhukk再次阅读了你的问题。这就是你想要的。如果您想要
1,5,9
,那么将
t(数据[nrow(数据),2:4])
替换为
t(数据[order(as.Date)(as.character(数据[,1]),%Y-%m-%d”)、2:ncol(数据)][nrow(数据)])
require(ggplot2)
require(reshape2)

df1 <- melt(Data, "Date")

g1 <- ggplot(subset(df1, Date>=as.Date("2017-06-30")), aes(x=Date, y=value))+
  geom_bar(aes(fill=variable), stat="identity", position="dodge")+
  theme_bw()