我是个新手.我想创建一个连续可变时间序列的geom_线图,然后添加一个由事件组成的层.连续变量及其时间戳存储在一个数据中.帧,事件及其时间戳存储在另一个数据中.框架

我想做的是类似于金融图表的事情.谷歌.通用域名格式.在这些时间序列中,时间序列是股票价格,有"标志"来表示新闻事件.我实际上并没有绘制金融方面的东西,但图形的类型是类似的.我试图绘制日志(log)文件数据的可视化图.这里有一个例子来说明我的意思...

谷歌活动图表

如果可行(?),我想使用单独的数据.每层的帧(一个用于连续变量观测,另一个用于事件).

经过一些try 和错误,这是我能得到的最接近的.这里,我使用的是来自ggplot附带的数据集的示例数据.《经济学》包含一些我想绘制的时间序列数据,《总统》包含一些事件(总统选举).

library(ggplot2)
data(presidential)
data(economics)

presidential <- presidential[-(1:3),]
yrng <- range(economics$unemploy)
ymin <- yrng[1]
ymax <- yrng[1] + 0.1*(yrng[2]-yrng[1])

p2 <- ggplot()
p2 <- p2 + geom_line(mapping=aes(x=date, y=unemploy), data=economics , size=3, alpha=0.5) 
p2 <- p2 + scale_x_date("time") +  scale_y_continuous(name="unemployed [1000's]")
p2 <- p2 + geom_segment(mapping=aes(x=start,y=ymin, xend=start, yend=ymax, colour=name), data=presidential, size=2, alpha=0.5)
p2 <- p2 + geom_point(mapping=aes(x=start,y=ymax, colour=name ), data=presidential, size=3) 
p2 <- p2 + geom_text(mapping=aes(x=start, y=ymax, label=name, angle=20, hjust=-0.1, vjust=0.1),size=6, data=presidential)
p2

我的try

问题:

  • 对于非常稀疏的事件,这是可以的,但是如果有一个集群(就像日志(log)文件中经常发生的那样),它就会变得混乱.有没有什么技巧可以用来整洁地显示短时间内发生的一系列事件?我在考虑位置抖动,但我真的很难走这么远.谷歌图表将这些事件"标志"叠加在一起,如果它们很多的话.

  • 实际上,我不喜欢将事件数据粘贴在与连续测量显示相同的刻度上.我更愿意把它放在一个平面网格中.问题是,所有方面都必须来自相同的数据.帧(不确定这是不是真的).如果是这样,这似乎也不理想(或者我只是想避免使用reshape ?)

推荐答案

虽然我很喜欢@JD Long的答案,但我会在R/ggplot2中放一个.

该方法是创建第二个事件数据集,并使用该数据集确定位置.从@Angelo的经历开始:

library(ggplot2)
data(presidential)
data(economics)

取出事件(总统)数据,并对其进行转换.将baselineoffset计算为其将绘制的经济数据的分数.将底部(ymin)设置为基线.这就是棘手的部分.如果标签靠得太近,我们需要能够错开标签.因此,确定相邻标签之间的间距(假设事件已排序).如果小于某个数量(我 Select 了大约4年的数据),那么请注意,该标签需要更高.但是它必须比后面的高,所以使用rle来获得TRUE的长度(也就是说,必须更高),并使用它来计算偏移向量(TRUE的每个字符串必须从其长度倒计时到2,FALSE正好在偏移量1处).使用该值确定杆(ymax)的顶部.

events <- presidential[-(1:3),]
baseline = min(economics$unemploy)
delta = 0.05 * diff(range(economics$unemploy))
events$ymin = baseline
events$timelapse = c(diff(events$start),Inf)
events$bump = events$timelapse < 4*370 # ~4 years
offsets <- rle(events$bump)
events$offset <- unlist(mapply(function(l,v) {if(v){(l:1)+1}else{rep(1,l)}}, l=offsets$lengths, v=offsets$values, USE.NAMES=FALSE))
events$ymax <- events$ymin + events$offset * delta

把这些放在一起形成一个情节:

ggplot() +
    geom_line(mapping=aes(x=date, y=unemploy), data=economics , size=3, alpha=0.5) +
    geom_segment(data = events, mapping=aes(x=start, y=ymin, xend=start, yend=ymax)) +
    geom_point(data = events, mapping=aes(x=start,y=ymax), size=3) +
    geom_text(data = events, mapping=aes(x=start, y=ymax, label=name), hjust=-0.1, vjust=0.1, size=6) +
    scale_x_date("time") +  
    scale_y_continuous(name="unemployed \[1000's\]")

你可以 Select 分面,但不同的尺度很难做到.另一种方法是合成两个图.必须进行一些额外的调整,以确保绘图具有相同的x范围,使标签都适合下部绘图,并消除上部绘图中的x轴.

xrange = range(c(economics$date, events$start))

p1 <- ggplot(data=economics, mapping=aes(x=date, y=unemploy)) +
    geom_line(size=3, alpha=0.5) +
    scale_x_date("", limits=xrange) +  
    scale_y_continuous(name="unemployed [1000's]") +
    opts(axis.text.x = theme_blank(), axis.title.x = theme_blank())

ylims <- c(0, (max(events$offset)+1)*delta) + baseline
p2 <- ggplot(data = events, mapping=aes(x=start)) +
    geom_segment(mapping=aes(y=ymin, xend=start, yend=ymax)) +
    geom_point(mapping=aes(y=ymax), size=3) +
    geom_text(mapping=aes(y=ymax, label=name), hjust=-0.1, vjust=0.1, size=6) +
    scale_x_date("time", limits=xrange) +
    scale_y_continuous("", breaks=NA, limits=ylims)

#install.packages("ggExtra", repos="http://R-Forge.R-project.org")
library(ggExtra)

align.plots(p1, p2, heights=c(3,1))

R相关问答推荐

使用gggplot 2在R中重新调整面板和y轴文本大小

使用R中的Shapetime裁剪格栅文件

编辑文件后编辑RhandsonTable

查找图下的面积

如何在R中合并和合并多个rabrame?

将向量组合到一个数据集中,并相应地命名行

如何在一次运行中使用count进行多列计数

未识别时区

如何提取所有完美匹配的10个核苷酸在一个成对的匹配与生物字符串在R?>

如何指定我的函数应该查找哪个引用表?

如何在R中平滑地绘制线图(不拟合)?

派生程序包| ;无法检索';return()';的正文

如何使用前缀作为匹配来连接数据帧?

'使用`purrr::pwalk`从嵌套的嵌套框架中的列表列保存ggplots时出现未使用的参数错误

判断函数未加载R中的库

如何移动点以使它们的打印不重叠

如何在shiny 的应用程序 map 视图宣传单中可视化单点

R/shiny APP:如何充分利用窗口?

组合名称具有模式的列表的元素

使用相对风险回归计算RR