R+;ggplot:带有事件的时间序列
我是个新手。我想创建一个连续可变时间序列的geom_线图,然后添加一个由事件组成的层。连续变量及其时间戳存储在一个data.frame中,事件及其时间戳存储在另一个data.frame中 我真正想做的是类似于finance.google.com上的图表。其中,时间序列是股票价格,有“标志”来表示新闻事件。我并没有实际绘制金融方面的东西,但图形的类型是类似的。我正在尝试绘制日志文件数据的可视化。这里有一个例子来说明我的意思 如果可行(?),我希望为每个层使用单独的data.frames(一个用于连续变量观测,另一个用于事件) 经过一些尝试和错误,这是接近我能得到的。这里,我使用的是来自ggplot附带的数据集的示例数据。“经济学”包含一些我想绘制的时间序列数据,“总统”包含一些事件(总统选举)R+;ggplot:带有事件的时间序列,r,ggplot2,visualization,graphing,R,Ggplot2,Visualization,Graphing,我是个新手。我想创建一个连续可变时间序列的geom_线图,然后添加一个由事件组成的层。连续变量及其时间戳存储在一个data.frame中,事件及其时间戳存储在另一个data.frame中 我真正想做的是类似于finance.google.com上的图表。其中,时间序列是股票价格,有“标志”来表示新闻事件。我并没有实际绘制金融方面的东西,但图形的类型是类似的。我正在尝试绘制日志文件数据的可视化。这里有一个例子来说明我的意思 如果可行(?),我希望为每个层使用单独的data.frames(一个用于
库(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")