我曾经在航运交易中看到this plot (LINK)。我与对话交流合作,并认为使用R.映射这种交换可能很有趣。
这是一个更大的问题,但我认为它可能对整个社区有用。
假设我们有7个人围着这样的桌子坐着:
我记录了对话交流,演讲者和听众听到了。我用这种信息创建了一个虚拟data.frame。这是头脑:
speaker receiver duration speaker.x speaker.y receiver.x receiver.y
1 D A 16 0.626 0.163 0.755 0.741
2 E D 3 0.391 0.161 0.626 0.163
3 A B 25 0.755 0.741 0.745 0.517
4 B E 6 0.745 0.517 0.391 0.161
5 B C 45 0.745 0.517 0.737 0.251
6 E F 37 0.391 0.161 0.258 0.285
我想创建动画箭头(从扬声器到接收器),这些箭头由扬声器和加权(时间/持续时间和长度和/或厚度)着色,并以与发货数据相同的方式设置动画(行number是语音发生的顺序。)我认为动画包可能在这里很有用,但是没有任何线索。也许这对目前的R来说是不可能的(正如Ben Schmidt的声明所表明的那样,“我一直希望我能够放弃ArcGIS来完成下一个我做的地图项目并保留R中的所有内容 - 我在这次经历之后,我不相信它是可能的“)。
我认为许多领域的许多人都可以使用这种交换映射,只是我对交换对话感兴趣。最终我会在光栅图像上绘制它,但这很容易。
这是迄今为止的数据和情节。
#the data
the_table <- data.frame(
xmin = .3,
xmax = .7,
ymin = .2,
ymax = .8
)
points <- structure(list(x = c(0.754594594594595, 0.744864864864865, 0.736756756756757,
0.626486486486486, 0.391351351351351, 0.258378378378378, 0.261621621621622
), y = c(0.741172932330827, 0.517052631578947, 0.250706766917293,
0.163007518796992, 0.161383458646617, 0.284812030075188, 0.494315789473684
)), .Names = c("x", "y"))
mapping <- data.frame(person=LETTERS[1:7], points)
set.seed(10)
n <- 120
dat <- data.frame(id = 1:n, speaker=sample(LETTERS[1:7], n, TRUE),
receiver=sample(LETTERS[1:7], n, TRUE),
duration=sample(1:50, n, TRUE)
)
dat <- dat[as.character(dat$speaker)!=as.character(dat$receiver), ]
dat <- merge(merge(dat, mapping, by.x=c("speaker"), by.y=c("person"), sort=FALSE),
mapping, by.x=c("receiver"), by.y=c("person"), sort=FALSE)
names(dat)[5:8] <- c("speaker.x", "speaker.y", "receiver.x", "receiver.y")
dat <- dat[order(dat$id), c(2, 1, 4:8)]
rownames(dat) <- NULL
#the plot
ggplot() +
geom_point(data=mapping, aes(x=x, y=y), size=10) +
geom_text(data=mapping, aes(x=x, y=y, label=as.character(person)),
color="blue") +
ylim(-.2, 1.2) + xlim(-.2, 1.2) +
geom_rect(data=the_table, aes(xmax = xmax, xmin=xmin,
ymin=ymin, ymax = ymax), fill="gray80")
我没有和ggplot2结婚但对它很偏爱,似乎很多这样的情节都使用了ggplot2。
答案 0 :(得分:5)
使用动画包和geom_segment
这是相当简单的
到目前为止,我唯一的问题是获得合理规模的比例
我已将会话数据保存为talking
library(animation)
library(RColorBrewer)
library(grid) ## for arrow
library(ggplot2)
# scale the duration (not ideal)
talking$scale_duration <-scale(talking$duration, center = FALSE)
# ensure that we have different colours for each speaker
ss <- levels(talking$speaker)
speakerCol <- scale_colour_manual(values = setNames(brewer.pal(n=length(ss), 'Set2' ), ss), guide = 'none')
# the base plot with the table and speakers (and `talking` base dataset)
base <- ggplot(data = talking, aes(colour = speaker)) +
geom_point(data=mapping, aes(x=x, y=y), size=10, inherit.aes = FALSE) +
geom_text(data=mapping, aes(x=x, y=y, label=as.character(person)),
inherit.aes = FALSE, color="blue") +
ylim(-.2, 1.2) + xlim(-.2, 1.2) +
geom_rect(data=the_table, aes(xmax = xmax, xmin=xmin,
ymin=ymin, ymax = ymax), fill="gray80", inherit.aes = FALSE) +
speakerCol
oopt <- ani.options(interval = 0.5)
# a function to create the animation
pp <- function(){
print(base)
interval = ani.options("interval")
for(n in rep(seq_along(talking$duration), each = talking$duration))){
# a segment for each row
tn <- geom_segment(aes(x= speaker.x, y= speaker.y, xend = receiver.x, yend = receiver.y), arrow = arrow(),
data =talking[n, ,drop = FALSE])
print(base + tn)
ani.pause()
}
}
使用saveGIF(pp(), interval = 0.1)
导出GIF动画等