【问题标题】:Format time series data and create grouped barplot格式化时间序列数据并创建分组条形图
【发布时间】:2013-09-10 21:44:46
【问题描述】:

好的,所以我正在以一种新的方式解决这个问题。我想创建一个分组条形图,显示每天三个位置的降水量。我的数据存储为 .csv 文件。这里是:

date    strick  huetten hornberg
31.01.2013  18.15   81.25   100
01.02.2013  12.7    11.75   NA
02.02.2013  59.7    61.25   NA
03.02.2013  NA  NA  NA
04.02.2013  NA  NA  NA
05.02.2013  45.25   31.3    NA
06.02.2013  NA  NA  NA
07.02.2013  NA  NA  NA
08.02.2013  NA  NA  NA
09.02.2013  NA  NA  NA
10.02.2013  NA  NA  NA
11.02.2013  NA  NA  NA
12.02.2013  NA  NA  NA
13.02.2013  NA  NA  NA
14.02.2013  NA  NA  NA
15.02.2013  NA  NA  NA
16.02.2013  NA  NA  NA
17.02.2013  NA  NA  NA
18.02.2013  NA  NA  NA
19.02.2013  NA  NA  NA
20.02.2013  NA  NA  NA
21.02.2013  NA  NA  NA
22.02.2013  NA  NA  NA
23.02.2013  NA  NA  NA
24.02.2013  NA  NA  NA
25.02.2013  NA  NA  NA
26.02.2013  NA  NA  NA
27.02.2013  NA  NA  NA
28.02.2013  55.6    NA  NA
01.03.2013  NA  NA  NA
02.03.2013  NA  NA  NA
03.03.2013  NA  NA  NA
04.03.2013  NA  NA  NA
05.03.2013  NA  NA  NA
06.03.2013  NA  NA  NA
07.03.2013  NA  NA  NA
08.03.2013  NA  NA  NA
09.03.2013  7.95    NA  NA
10.03.2013  NA  NA  NA
11.03.2013  9.65    76.2    NA
12.03.2013  1.65    3.35    NA
13.03.2013  NA  NA  NA
14.03.2013  NA  NA  NA
15.03.2013  NA  NA  NA
16.03.2013  NA  NA  NA
17.03.2013  NA  NA  NA
18.03.2013  NA  NA  NA
19.03.2013  NA  NA  NA
20.03.2013  30.2    NA  NA
21.03.2013  12.05   NA  NA
22.03.2013  NA  NA  NA
23.03.2013  NA  NA  NA
24.03.2013  2.15    NA  NA
25.03.2013  0.25    NA  NA
26.03.2013  NA  NA  NA
27.03.2013  NA  NA  NA
28.03.2013  11.4    NA  NA
29.03.2013  NA  NA  NA
30.03.2013  12.25   NA  NA
31.03.2013  6   NA  NA
01.04.2013  5.6 NA  NA
02.04.2013  NA  NA  NA
03.04.2013  NA  NA  NA
04.04.2013  NA  NA  NA
05.04.2013  NA  NA  NA
06.04.2013  NA  NA  NA
07.04.2013  NA  NA  NA
08.04.2013  NA  78.25   NA
09.04.2013  2.9 NA  NA
10.04.2013  15.6    14.25   NA
11.04.2013  11.55   11.15   NA
12.04.2013  34.8    34.75   NA
13.04.2013  9.65    11.1    NA

如何创建分组条形图所需的矩阵/表格,以及如何使条形图的 x 轴看起来完全像这样(我的时间序列与图中相同):

此示例图的代码是:

setwd("path")
rb=read.csv("mean_alllocations1.csv", header=TRUE, sep=";")
rb$DATE<-as.POSIXct(rb$DATE, format = "%d.%m.%Y")
pdf("air_temp_mean_all_locations.pdf", width=12,height=6)
a=c("31.01.2013","07.02.2013", "14.02.2013", "21.02.2013", "28.02.2013", "07.03.2013", "14.03.2013", "21.03.2013", "28.03.2013","04.04.2013", "11.04.2013")
a<-as.POSIXct(a, format = "%d.%m.%Y")
b=c("31.01.2013","01.02.2013","02.02.2013","03.02.2013","04.02.2013","05.02.2013","06.02.2013","07.02.2013","08.02.2013","09.02.2013","10.02.2013","11.02.2013","12.02.2013","13.02.2013","14.02.2013","15.02.2013","16.02.2013","17.02.2013","18.02.2013","19.02.2013","20.02.2013","21.02.2013","22.02.2013","23.02.2013","24.02.2013","25.02.2013","26.02.2013","27.02.2013","28.02.2013","01.03.2013","02.03.2013","03.03.2013","04.03.2013","05.03.2013","06.03.2013","07.03.2013","08.03.2013","09.03.2013","10.03.2013","11.03.2013","12.03.2013","13.03.2013","14.03.2013","15.03.2013","16.03.2013","17.03.2013","18.03.2013","19.03.2013","20.03.2013","21.03.2013","22.03.2013","23.03.2013","24.03.2013","25.03.2013","26.03.2013","27.03.2013","28.03.2013","29.03.2013","30.03.2013","31.03.2013","01.04.2013","02.04.2013","03.04.2013","04.04.2013","05.04.2013","06.04.2013","07.04.2013","08.04.2013","09.04.2013","10.04.2013","11.04.2013","12.04.2013","13.04.2013")
b<-as.POSIXct(b, format = "%d.%m.%Y")
par(mar=c(5,4,0.5,0.5))
plot(rb$DATE, rb$RBGL830_TEMP_MIN, ylim=c(-10,10), xlim = c(min(rb$DATE),max(rb$DATE)), axes = TRUE, "l", xaxt="n", yaxt="n", col="olivedrab2", lwd=1.0, xlab="", ylab="",xaxs="i", panel.first= abline(h = c(-10, -5, 0, 5, 10), col = "grey", lty = 3))
axis(2, c(-10, 10, c(-10, -5, 0, 5, 10)), las=1)
axis(1, at=a, labels=FALSE)
axis(1, at=b, labels=FALSE, tck=-0.01)
text(a, par("usr")[3] - 0.8, srt = 45, adj = 1,labels =format(a, format ="%d.%m.%Y"), xpd = TRUE) 
mtext(1, text="Time", line=4)
mtext(2, text="Mean Daily Air Temperature [°C]", line=2.5)
abline(h = c(20, 15, 10, 5, 0, -5, -10, -15, -20), col = "grey", lty = 2)
lines(rb$DATE, rb$SBGL836_TEMP_MIN, "l", col="limegreen", lwd=1.0)
lines(rb$DATE, rb$SBGL989_TEMP_MIN, "l", col="darkgreen", lwd=1.0)
lines(rb$DATE, rb$SBBF872_TEMP_MIN, "l", col="sienna3", lwd=1.0)
lines(rb$DATE, rb$SBF993_TEMP_MIN, "l", col="sienna4", lwd=1.0)
points(rb$DATE, rb$RBGL830_TEMP_MIN, pch=20, col="olivedrab2")
points(rb$DATE, rb$SBGL836_TEMP_MIN, pch=20, col="limegreen")
points(rb$DATE, rb$SBGL989_TEMP_MIN, pch=20, col="darkgreen")
points(rb$DATE, rb$SBBF872_TEMP_MIN, pch=18, col="sienna3")
points(rb$DATE, rb$SBF993_TEMP_MIN, pch=18, col="sienna4")
legend("bottomright", c("[4] SB Grassland 989 m","[5] SB Grassland 836 m","[8] RB Grassland 830 m","[6] SB Forest 993 m","[7] SBB Forest 872 m"), bty="n" , lwd=c(1.0,1.0,1.0,1.0,1.0), pch=c(20,20,20,18,18), col=c("darkgreen","limegreen","olivedrab2","sienna4","sienna3"))
dev.off()

我手动创建了一个矩阵并从中创建了一个条形图,但是有一个错误(不应该有“hornberg”的值->查看数据)并且使用这种方法我不知道 x 轴如何时间序列。

a<-c(18.15,12.7,59.7,NA,NA,45.25,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,55.6,NA,NA,NA,NA,NA,NA,NA,NA,7.95,NA,9.65,1.65,NA,NA,NA,NA,NA,NA,NA,30.2,12.05,NA,NA,2.15,0.25,NA,NA,11.4,NA,12.25,6,5.6,NA,NA,NA,NA,NA,NA,NA,2.9,15.6,11.55,34.8,9.65)
b<-c(81.25,11.75,61.25,NA,NA,31.3,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,76.2,3.35,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,78.25,NA,14.25,11.15,34.75,11.1)
c<-c(NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA)
mymatrix<-matrix(c(a,b,c),73)
colnames(mymatrix)<-c("huetten","strick","hornberg")
rownames(mymatrix)<-c("31.01.2013","01.02.2013","02.02.2013","03.02.2013","04.02.2013","05.02.2013","06.02.2013","07.02.2013","08.02.2013","09.02.2013","10.02.2013","11.02.2013","12.02.2013","13.02.2013","14.02.2013","15.02.2013","16.02.2013","17.02.2013","18.02.2013","19.02.2013","20.02.2013","21.02.2013","22.02.2013","23.02.2013","24.02.2013","25.02.2013","26.02.2013","27.02.2013","28.02.2013","01.03.2013","02.03.2013","03.03.2013","04.03.2013","05.03.2013","06.03.2013","07.03.2013","08.03.2013","09.03.2013","10.03.2013","11.03.2013","12.03.2013","13.03.2013","14.03.2013","15.03.2013","16.03.2013","17.03.2013","18.03.2013","19.03.2013","20.03.2013","21.03.2013","22.03.2013","23.03.2013","24.03.2013","25.03.2013","26.03.2013","27.03.2013","28.03.2013","29.03.2013","30.03.2013","31.03.2013","01.04.2013","02.04.2013","03.04.2013","04.04.2013","05.04.2013","06.04.2013","07.04.2013","08.04.2013","09.04.2013","10.04.2013","11.04.2013","12.04.2013","13.04.2013")
pdf("test.pdf",width=12,height=6)
barplot(mymatrix, beside=TRUE, ylim=c(0,100), col=c("blue","red","black"),las=1)
mtext(2, text="Precipitation [mm/d]", line=2.7)
box()
dev.off()

【问题讨论】:

  • 不确定您的问题是什么,但 R 中的 matrix 必须是一种类型。所以你应该只在这种情况下使用你的数字数据(我认为)。您可以将矩阵的rownames 设置为您想要的任何东西(几乎)......但我不知道这是否是您的问题。你能提供一些线索来说明你在更广泛的意义上要完成什么吗?
  • 在此期间!?所以我们应该花时间在你搜索的时候帮助你回答问题吗?你应该做你的search and research before asking your question。另请阅读this
  • @Justin:我想最终创建一个分组条形图,据我了解,您需要一个矩阵来这样做。由于我有很多值,我希望能够将我的 data.frame 从 .csv 文件“转换”为矩阵。对于我的条形图,我希望 y 轴上的值和 x 轴上的日期给我一个分组条形图,每个日期三个条形图。我不想手动创建矩阵,我相信应该有一种方法可以为每组值分配日期。
  • @Henrik:我一直在研究并试图弄清楚。我是 r 和编程语言的绝对初学者,所以我需要很多时间来弄清楚事情,而且我有一些时间压力。如果我能够自己解决它,我就不会发布问题,同时我还不如做更多的研究而不是什么都不做。
  • @samjam,我完全理解作为初学者的挣扎。我强烈建议您阅读introductory texts,通过在 SO 上找到的示例进行工作,例如here,正确搜索您的“关键字”,例如like thislike this。最后,我认为在许多(大多数?)情况下,您可以在绘图时将数据保存在数据框中。如果您在某个时候想要使用ggplot,您的数据必须位于数据框中。

标签: r time matrix dataframe bar-chart


【解决方案1】:

当您使用read.table 将文件读入R 时,无需将生成的数据框转换为矩阵。在我的示例中,我假设您的数据框名为“df”。

# load necessary packages
library(reshape2)
library(ggplot2)
library(scales)

# melt data from wide to long format
df2 <- melt(data = df, id.vars = "date", variable.name = "Location", value.name = "Precipitation")
str(df2)

# change 'date' to class Date
df2$date <- as.Date(df2$date, format = "%d.%m.%Y")

# reorder and rename levels of Location
df2$Location <- factor(df2$Location,
                       levels = c("hornberg", "huetten", "strick"),
                       labels = c("Hornberg", "Huetten", "Strick"))

# plot
ggplot(data = df2, aes(x = date, y = Precipitation, fill = Location)) +
  geom_bar(stat = "identity", position = "dodge") +
  scale_x_date(
    breaks = seq(from = as.Date("2013-01-31"), to = as.Date("2013-04-13"), by = "week"),
    labels = date_format("%d.%m.%Y")) +
  coord_cartesian(ylim = c(0, 105)) +
  xlab("Date") +
  ylab("Precipitation (mm/d)") +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1),
        panel.grid.major.x = element_blank(),
        panel.grid.minor.x = element_blank(),
        panel.grid.major.y = element_line(linetype = "longdash"))

【讨论】:

  • 嗨 henrik,非常感谢您的帮助!!!这就是我试图创造的!只有两个问题,我才会对情节感到满意:1)如何将日期格式从“年-月-日”更改为“日.月.年”。我试过这个: ...scale_x_date(breaks = seq(from = as.Date("31.01.2013"), format= "%d.%m.%Y", to = as.Date("13.04.2013") ), format= "%d.%m.%Y", by = "week"))... -> 将格式插入 seq.column 但我收到此错误:
  • charToDate(x) 中的错误:字符串不是标准的明确格式。 2)为什么我的情节中有y偏移而你没有?我不想要 y 和 x 轴偏移。我尝试了“+ coord_cartesian(xlim = c(0, 90))”,但什么也没发生。查看我当前情节的遮阳篷
  • 再次感谢您的努力,您非常乐于助人!我将您的答案标记为合适并投了赞成票。
【解决方案2】:

使用这个:

structure(as.matrix(x[,-1]), dimnames=list(as.character(x[,1]),names(x)[-1]))

结果:

           London New_York Moscow
31.01.2013    400      750    390
01.02.2013    350      700    300
02.02.2013    330      730    250
03.02.3013    300      650    250

OBS:使用输入:

x <- read.table(header=TRUE,text="
Date         London   New_York   Moscow    
31.01.2013   400      750        390
01.02.2013   350      700        300
02.02.2013   330      730        250
03.02.3013   300      650        250
")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-24
    • 2018-12-22
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    相关资源
    最近更新 更多