重复x轴R

时间:2018-11-26 15:21:06

标签: r

我有连续三天在特定时间(小时,分钟)的辐射量数据。我想绘制此图,以便x轴从0-24变为3倍。因此,x轴会重复。并且在y轴上的辐射量。我尝试了以下脚本,但没有成功。

plot(gegevens[,1],gegevens[,2],type='l',col='red',xaxt='n',yaxt='n',xlab='',ylab='')

axis(1, at=(0:74),labels = rep.int(0:24,3), las=2)

mtext('Zonnetijd (u)', side=1,line=3)

数据集很大,所以我选择了2天的前两个小时。第一列是时间,第二列是辐射。数据如下所示:

structure(c(0, 0.083333333333333, 0.166666666666667, 0.25, 0.333333333333333, 
0.416666666666667, 0.5, 0.583333333333333, 0.666666666666667, 
0.75, 0.833333333333333, 0.916666666666667, 1, 1.08333333333333, 
1.16666666666667, 1.25, 1.33333333333333, 1.41666666666667, 1.5, 
1.58333333333333, 1.66666666666667, 1.75, 1.83333333333333, 1.91666666666667, 
0.0158590638878904, 0.0991923972212234, 0.182525730554557, 0.26585906388789, 
0.349192397221223, 0.432525730554557, 0.51585906388789, 0.599192397221223, 
0.682525730554557, 0.76585906388789, 0.849192397221223, 0.932525730554557, 
1.01585906388789, 1.09919239722122, 1.18252573055456, 1.26585906388789, 
1.34919239722122, 1.43252573055456, 1.51585906388789, 1.59919239722122, 
1.68252573055456, 1.76585906388789, 1.84919239722122, 1.93252573055456, 
0.066, 0.066, 0.068, 0.068, 0.068, 0.066, 0.066, 0.066, 0.066, 
0.066, 0.066, 0.066, 0.057, 0, 0, 0, -0.002, 0, 0, -0.002, 0, 
-0.002, -0.009, -0.011, 0, -0.002, 0, -0.002, 0, -0.002, 0, 0.002, 
0, 0, 0, 0, -0.002, -0.002, -0.007, 0, -0.002, 0, 0, 0, -0.002, 
-0.002, -0.002, 0), .Dim = c(48L, 2L), .Dimnames = list(NULL, 
    c("t", "z")))

2 个答案:

答案 0 :(得分:2)

我认为您最好改用轴的日期/时间类。然后,您可以对绘制的内容进行更多控制。下面是一个示例:

# create example data
df <- data.frame(
  T = seq.POSIXt(as.POSIXct("2000-01-01 00:00:00"), 
    by = "hours", length.out = 24*3)
)
df
df$St <- cumsum(rnorm(24*3))

# plot
png("test.png", width = 8, height = 4, units = "in", res = 200)
op <- par(mar = c(4,4,1,1), ps = 8)
plot(St ~ T, df, type="l",col='red',xaxt='n',yaxt='n',xlab='',ylab='')
axis(1, at=df$T, labels = format(df$T, "%H"), las=2)
mtext('Zonnetijd (u)', side=1,line=3)
par(op)
dev.off()

enter image description here

当您绘制每个标签时,您会发现标签可能存在一些空间问题。

这是另一个带有3小时增量标签的示例:

# alt plot
AT <- seq(min(df$T), max(df$T), by = "3 hour") # 3 hour increments
LAB <- format(AT, "%H")
png("test2.png", width = 8, height = 4, units = "in", res = 200)
op <- par(mar = c(4,4,1,1), ps = 8)
plot(St ~ T, df, type="l",col='red', xlab='', ylab='', xaxt='n')
axis(1, at = AT, labels = LAB, las=2)
mtext('Zonnetijd (u)', side=2, line=3)
mtext('hour', side=1, line=3)
par(op)
dev.off()

enter image description here

答案 1 :(得分:1)

Marc对于使用datetime类有很好的建议。总体而言,这是一个很好的方法。 See this question for examples of converting decimal times in hours to POSIX datetime class

如果您要继续使用数字数据,请使用数据本身来指示发生的日期。在这里,我们创建了一个与第一列相同的新列,但是每当第一列在连续行之间具有负差时,就添加24

gegevens = cbind(gegevens, gegevens[, 1] + 24 * c(0, cumsum(diff(gegevens[, 1]) < 0)))

现在,当我们使用新列进行绘图时,小时数将按天正确间隔:

plot(gegevens[, 3], gegevens[, 2], type = 'l', col = 'red', xaxt = 'n', yaxt = 'n', xlab = '', ylab = '')

您还有一些轴问题。没有24小时,我们通常将其称为0小时。还有24 * 3 = 72,而不是74,因此我们的最长小时数(从0开始)为71

axis(1, at= 0:71, labels = rep.int(0:23,3), las = 2)

这是样本数据上的结果图。它应该“处理”您的全部数据,但是我同意Marc的说法,可能是标签太多了。使用POSIXct日期时间格式是灵活进行调整的最佳方法。

enter image description here