R+;ggplot:带有事件的时间序列

R+;ggplot:带有事件的时间序列,r,ggplot2,visualization,graphing,R,Ggplot2,Visualization,Graphing,我是个新手。我想创建一个连续可变时间序列的geom_线图,然后添加一个由事件组成的层。连续变量及其时间戳存储在一个data.frame中,事件及其时间戳存储在另一个data.frame中 我真正想做的是类似于finance.google.com上的图表。其中,时间序列是股票价格,有“标志”来表示新闻事件。我并没有实际绘制金融方面的东西,但图形的类型是类似的。我正在尝试绘制日志文件数据的可视化。这里有一个例子来说明我的意思 如果可行(?),我希望为每个层使用单独的data.frames(一个用于

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

我真正想做的是类似于finance.google.com上的图表。其中,时间序列是股票价格,有“标志”来表示新闻事件。我并没有实际绘制金融方面的东西,但图形的类型是类似的。我正在尝试绘制日志文件数据的可视化。这里有一个例子来说明我的意思

如果可行(?),我希望为每个层使用单独的data.frames(一个用于连续变量观测,另一个用于事件)

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

库(ggplot2)
数据(总统)
数据(经济)

总统现在我和下一个家伙一样喜欢ggplot,但是如果你想制作谷歌金融类型的图表,为什么不使用谷歌图形API呢?!?你会喜欢这个的:

install.packages("googleVis")
library(googleVis)

dates <- seq(as.Date("2011/1/1"), as.Date("2011/12/31"), "days")
happiness <- rnorm(365)^ 2
happiness[333:365] <- happiness[333:365]  * 3 + 20
Title <- NA
Annotation <- NA
df <- data.frame(dates, happiness, Title, Annotation)
df$Title[333] <- "Discovers Google Viz"
df$Annotation[333] <- "Google Viz API interface by Markus Gesmann causes acute increases in happiness."

### Everything above here is just for making up data ### 
## from here down is the actual graphics bits        ###
AnnoTimeLine  <- gvisAnnotatedTimeLine(df, datevar="dates",
                                       numvar="happiness", 
                                       titlevar="Title", annotationvar="Annotation",
                                       options=list(displayAnnotations=TRUE,
                                                    legendPosition='newRow',
                                                    width=600, height=300)
                                       )
# Display chart
plot(AnnoTimeLine) 
# Create Google Gadget
cat(createGoogleGadget(AnnoTimeLine), file="annotimeline.xml")
install.packages(“googleVis”)
图书馆(谷歌)

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

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

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

你可以选择分面,但不同的尺度是很棘手的。另一种方法是合成两个图。必须进行一些额外的修改,以确保绘图具有相同的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))
xrange=range(c(经济$date,事件$start))

p1
绘图
是使ggplots交互的一种简单方法。要显示事件,请将它们强制转换为可以显示为美学效果的因素,如颜色

最终结果是一个可以将光标拖动到其上的绘图。绘图显示感兴趣的数据:

以下是绘制ggplot的代码:

# load data    
data(presidential)
data(economics)

# events of interest
events <- presidential[-(1:3),]

# strip year from economics and events data frames
economics$year = as.numeric(format(economics$date, format = "%Y")) 

# use dplyr to summarise data by year
#install.packages("dplyr")
library(dplyr)
econonomics_mean <- economics %>% 
  group_by(year) %>% 
  summarise(mean_unemployment = mean(unemploy))

# add president terms to summarized data frame as a factor
president <- c(rep(NA,14), rep("Reagan", 8), rep("Bush", 4), rep("Clinton", 8), rep("Bush", 8), rep("Obama", 7))
econonomics_mean$president <- president

# create ggplot
p <- ggplot(data = econonomics_mean, aes(x = year, y = mean_unemployment)) +
  geom_point(aes(color = president)) +
  geom_line(alpha = 1/3)

考虑到您正在绘制时间序列和定性信息,大多数经济书籍都使用绘制区域来表示数据上的结构变化或事件,因此我建议您使用以下内容:

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

ggplot() +
  geom_rect(aes(xmin = start,
                xmax = end,
                ymin = 0, ymax = Inf,
                fill = name),
            data = presidential,
            show.legend = F) +
  geom_text(aes(x = start+500,
                y = 2000,
                label = name,
                angle = 90),
            data = presidential) +
  geom_line(aes(x = date, y = unemploy),
            data= economics) +
  scale_fill_brewer(palette = "Blues") +
  labs(x = "time", y = "unemploy")


有趣的情节:别指望共和党总统上台后能找到工作!这是最方便和可用的数据,可以作为一个例子——但是,是的,它确实让你想:——)你感觉到幸福感在增加,不是吗?看,图表不会说谎!:)预测:你会从那次演示中获得一个很好的口碑。呜呜!在你和@JDLong之间,我今天学到了一些非常好的R功夫!非常有用,谢谢@Brian Diggs。有点不赞成。这是一个更新版本的代码:(不得不摆弄边距,单调乏味-自然可以随意复制粘贴)。哇,这真是太棒了。谢谢
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))
# load data    
data(presidential)
data(economics)

# events of interest
events <- presidential[-(1:3),]

# strip year from economics and events data frames
economics$year = as.numeric(format(economics$date, format = "%Y")) 

# use dplyr to summarise data by year
#install.packages("dplyr")
library(dplyr)
econonomics_mean <- economics %>% 
  group_by(year) %>% 
  summarise(mean_unemployment = mean(unemploy))

# add president terms to summarized data frame as a factor
president <- c(rep(NA,14), rep("Reagan", 8), rep("Bush", 4), rep("Clinton", 8), rep("Bush", 8), rep("Obama", 7))
econonomics_mean$president <- president

# create ggplot
p <- ggplot(data = econonomics_mean, aes(x = year, y = mean_unemployment)) +
  geom_point(aes(color = president)) +
  geom_line(alpha = 1/3)
# make it interactive!
#install.packages("plotly")
library(plotly)
ggplotly(p)
library(ggplot2)
data(presidential)
data(economics)

ggplot() +
  geom_rect(aes(xmin = start,
                xmax = end,
                ymin = 0, ymax = Inf,
                fill = name),
            data = presidential,
            show.legend = F) +
  geom_text(aes(x = start+500,
                y = 2000,
                label = name,
                angle = 90),
            data = presidential) +
  geom_line(aes(x = date, y = unemploy),
            data= economics) +
  scale_fill_brewer(palette = "Blues") +
  labs(x = "time", y = "unemploy")