我正在制作一个非常宽的图表,当输出为PNG文件时,在x轴上占用几千个像素; 有大约20年的每日数据.(这可能会或可能不会被视为良好做法,但它仅供我自己使用,不适用于发布.)因为图表太宽,所以当您滚动图表时,y轴会从视图中消失.因此,我想以2年的间隔向图中添加标签,以显示y轴上的值.生成的图表看起来像下面的一个,除了在保持其紧凑我用只有30天假数据的利益,并把标签大约每隔10天:

这可以根据需要或多或少地工作,但我想知道是否有更好的方法来接近它,如在此图表中(参见下面的代码)我有一个列,分别为120,140和160的3个y轴值.真实数据有更多级别,所以我最终会调用15次geom_text来将所有内容放在绘图区域.
问:是否有更简单的方法将所有20多个日期(每个日期有15个标签)一次性打印到图表上?
require(ggplot2)
set.seed(12345)
mydf <- data.frame(mydate = seq(as.Date('2012-01-01'), as.Date('2012-01-31'), by = 'day'),
price = runif(31, min = 100, max = 200))
mytext <- data.frame(mydate = as.Date(c('2012-01-10', '2012-01-20')),
col1 = c(120, 120), col2 = c(140,140), col3 = c(160,160))
p <- ggplot(data = mydf) +
geom_line(aes(x = mydf$mydate, y = mydf$price), colour = 'red', size = 0.8) +
geom_text(data = mytext, aes(x = mydate, y = col1, label = col1), size = 4) +
geom_text(data = mytext, aes(x = mydate, y = col2, label = col2), size = 4) +
geom_text(data = mytext, aes(x = mydate, y = col3, label = col3), size = 4)
print(p)
Run Code Online (Sandbox Code Playgroud)
ggplot2喜欢长格式的数据,因此melt()将文本转换成长格式可让您只需拨打一次电话geom_text():
require(reshape2)
mytext.m <- melt(mytext, id.vars = "mydate")
Run Code Online (Sandbox Code Playgroud)
然后你的绘图命令变成:
ggplot(data = mydf) +
geom_line(aes(x = mydf$mydate, y = mydf$price), colour = 'red', size = 0.8) +
geom_text(data = mytext.m, aes(x = mydate, y = value, label = value), size = 4)
Run Code Online (Sandbox Code Playgroud)