我是新的R用户。我希望在剧情中获得多个级别的垂直线条,如:
按小时划分使用非常浅灰色的线条。
每天打破使用浅灰色的线条。
按周拆分使用灰色线条。
library(ggplot2)
library(lubridate)
library(scales)
ggplot(df,aes(x=df$DateTime,y=df$Val,ymin=0),xaxt="n") +
scale_x_datetime(labels = date_format("%m-%d"), breaks = date_breaks("days"), expand=c(0,0)) +
theme(text=element_text(size=10),
legend.text=element_text(size=10),
panel.background = element_rect(fill = "white", colour = "black")) +
geom_line(lwd=1)
这里是示例df:
df <- read.table(text="
DateTime, Val
2017-06-13 00:00:00,5651.000
2017-06-13 01:00:00,5937.000
2017-06-13 02:00:00,5910.000
2017-06-13 03:00:00,5778.000
2017-06-13 04:00:00,5784.000
2017-06-13 05:00:00,5368.000
2017-06-13 06:00:00,5507.000
2017-06-13 07:00:00,5720.000
2017-06-13 08:00:00,6310.000
2017-06-13 09:00:00,6497.000
2017-06-13 10:00:00,6662.000
2017-06-13 11:00:00,6502.000
2017-06-13 12:00:00,6400.000
2017-06-13 13:00:00,6823.000
2017-06-13 14:00:00,6920.000
2017-06-13 15:00:00,6542.000
2017-06-13 16:00:00,6546.000
2017-06-13 17:00:00,5677.000
2017-06-13 18:00:00,5771.000
2017-06-13 19:00:00,5982.000
2017-06-13 20:00:00,6008.000
2017-06-13 21:00:00,6152.000
2017-06-13 22:00:00,6080.000
2017-06-13 23:00:00,5879.000
2017-06-14 00:00:00,5760.000
2017-06-14 01:00:00,5872.000
2017-06-14 02:00:00,5961.000
2017-06-14 03:00:00,5782.000
2017-06-14 04:00:00,5860.000
2017-06-14 05:00:00,5361.000
2017-06-14 06:00:00,5567.000
2017-06-14 07:00:00,5864.000
2017-06-14 08:00:00,6349.000
2017-06-14 09:00:00,6556.000
2017-06-14 10:00:00,6646.000
2017-06-14 11:00:00,6572.000
2017-06-14 12:00:00,6610.000
2017-06-14 13:00:00,6612.000
2017-06-14 14:00:00,6844.000
2017-06-14 15:00:00,6717.000
2017-06-14 16:00:00,6919.500
2017-06-14 17:00:00,6294.500
2017-06-14 18:00:00,5573.000
2017-06-14 19:00:00,5993.000
2017-06-14 20:00:00,6053.000
2017-06-14 21:00:00,6102.000
2017-06-14 22:00:00,6159.000
2017-06-14 23:00:00,6047.000
2017-06-15 00:00:00,5882.000
2017-06-15 01:00:00,5973.000
2017-06-15 02:00:00,6082.000
2017-06-15 03:00:00,5994.000
2017-06-15 04:00:00,5904.000
2017-06-15 05:00:00,5409.000
2017-06-15 06:00:00,5511.000
2017-06-15 07:00:00,5771.000
2017-06-15 08:00:00,6363.000
2017-06-15 09:00:00,6559.000
2017-06-15 10:00:00,6838.000
2017-06-15 11:00:00,6659.000
2017-06-15 12:00:00,6426.000
2017-06-15 13:00:00,6909.000
2017-06-15 14:00:00,6879.000
2017-06-15 15:00:00,6837.000
2017-06-15 16:00:00,6813.000
2017-06-15 17:00:00,6007.000
2017-06-15 18:00:00,6046.000
2017-06-15 19:00:00,6088.000
2017-06-15 20:00:00,6281.000
2017-06-15 21:00:00,6345.000
2017-06-15 22:00:00,6319.000
2017-06-15 23:00:00,6063.000
2017-06-16 00:00:00,5897.000
2017-06-16 01:00:00,6113.000
2017-06-16 02:00:00,6198.000
2017-06-16 03:00:00,6029.000
2017-06-16 04:00:00,5970.000
2017-06-16 05:00:00,5486.000
2017-06-16 06:00:00,5621.000
2017-06-16 07:00:00,5885.000
2017-06-16 08:00:00,6440.000
2017-06-16 09:00:00,6604.000
2017-06-16 10:00:00,6731.000
2017-06-16 11:00:00,6523.000
2017-06-16 12:00:00,6411.000
2017-06-16 13:00:00,6882.000
2017-06-16 14:00:00,6908.000
2017-06-16 15:00:00,6843.000
2017-06-16 16:00:00,6791.000
2017-06-16 17:00:00,5324.000
2017-06-16 18:00:00,5207.000
2017-06-16 19:00:00,5323.000
2017-06-16 20:00:00,6186.000
2017-06-16 21:00:00,6278.000
2017-06-16 22:00:00,6156.000
2017-06-16 23:00:00,6001.000
2017-06-17 00:00:00,5884.000
2017-06-17 01:00:00,6016.000
2017-06-17 02:00:00,5959.000
2017-06-17 03:00:00,5804.000
2017-06-17 04:00:00,5669.000
2017-06-17 05:00:00,4760.000
2017-06-17 06:00:00,4588.000
2017-06-17 07:00:00,4428.000
2017-06-17 08:00:00,4602.000
2017-06-17 09:00:00,4762.000
2017-06-17 10:00:00,4912.000
2017-06-17 11:00:00,4828.000
2017-06-17 12:00:00,4828.000
2017-06-17 13:00:00,4970.250
2017-06-17 14:00:00,4997.250
2017-06-17 15:00:00,4914.250
2017-06-17 16:00:00,4933.250
2017-06-17 17:00:00,4753.000
2017-06-17 18:00:00,4712.000
2017-06-17 19:00:00,3910.000
2017-06-17 20:00:00,3625.000
2017-06-17 21:00:00,3398.000
2017-06-17 22:00:00,3379.000
2017-06-17 23:00:00,3309.000
2017-06-18 00:00:00,3313.000
2017-06-18 01:00:00,3291.000
2017-06-18 02:00:00,3289.000
2017-06-18 03:00:00,3287.000
2017-06-18 04:00:00,3263.000
2017-06-18 05:00:00,3220.000
2017-06-18 06:00:00,3215.000
2017-06-18 07:00:00,2311.000
2017-06-18 08:00:00,1804.000
2017-06-18 09:00:00,1126.000
2017-06-18 10:00:00,931.000
2017-06-18 11:00:00,944.500
2017-06-18 12:00:00,965.500
2017-06-18 13:00:00,951.000
2017-06-18 14:00:00,972.000
2017-06-18 15:00:00,963.000
2017-06-18 16:00:00,949.000
2017-06-18 17:00:00,948.000
2017-06-18 18:00:00,941.000
2017-06-18 19:00:00,938.000
2017-06-18 20:00:00,932.000
2017-06-18 21:00:00,922.000
2017-06-18 22:00:00,935.000
2017-06-18 23:00:00,1011.231
2017-06-19 00:00:00,1022.231
2017-06-19 01:00:00,1017.231
2017-06-19 02:00:00,1020.231
2017-06-19 03:00:00,1020.231
2017-06-19 04:00:00,1101.231
2017-06-19 05:00:00,1912.231
2017-06-19 06:00:00,3530.231
2017-06-19 07:00:00,4894.231
2017-06-19 08:00:00,6238.231
2017-06-19 09:00:00,6523.231
2017-06-19 10:00:00,6502.231
2017-06-19 11:00:00,6408.231
2017-06-19 12:00:00,6275.000
2017-06-19 13:00:00,6760.000
2017-06-19 14:00:00,6804.000
2017-06-19 15:00:00,6943.000
2017-06-19 16:00:00,6935.000
2017-06-19 17:00:00,5984.000
2017-06-19 18:00:00,5754.000
2017-06-19 19:00:00,6086.000
2017-06-19 20:00:00,6219.000
2017-06-19 21:00:00,6206.000
2017-06-19 22:00:00,6172.000
2017-06-19 23:00:00,6029.000
2017-06-20 00:00:00,5836.000",sep=",",header=TRUE,stringsAsFactors=FALSE)
df$DateTime <- as.POSIXct(df$DateTime)
我刚刚在Paint中编辑了哈哈。你可以看到我把非常轻的线条放在3个不同的等级上(平日开始时间为每周年&#39;星期一&#39;,日和小时)。
非常感谢你的帮助。
答案 0 :(得分:2)
首先,永远不要在df$..
内使用aes
,否则会导致ggplot2
non standard evaluation陷入困境。
我们可以使用主要和次要panel.grid
来显示不同的垂直线。但是,这只能用于两个“级别”。
但我们也可以添加一个geom_vline()
,它会添加一些垂直线:
library(ggplot2)
library(scales)
# Create the dataframe with the weeks interval
weeks <- data.frame(w = seq(min(df$DateTime), max(df$DateTime), 'week'))
ggplot(df) +
# plot line
geom_line(aes(x = DateTime,y=Val)) +
# plot vertical weekly lines
geom_vline(data = weeks,
aes(xintercept = as.numeric(w)),
color = 'grey55', size = 2) +
scale_x_datetime(labels = date_format("%m-%d"),
breaks = date_breaks("days"),
# add minor breaks
minor_breaks = date_breaks("hours"),
expand = c(0,0)) +
theme(text = element_text(size=10),
legend.text = element_text(size=10),
panel.background = element_rect(fill = "white", colour = "black"),
# display daily grid
panel.grid.major.x = element_line(color = 'grey75', size = 1),
# display hourly grid
panel.grid.minor.x = element_line(color = 'grey85', size = .1))