Построение анимированного обмена (построение направленных ребер)

Я однажды виделэтот сюжет (ССЫЛКА) на судоходных торгах. Я работаю с диалоговыми обменами и подумал, что может быть интересно отобразить такой обмен с использованием 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

Я хотел бы создать анимированные стрелки (от говорящего к получателю), которые раскрашены по динамику и взвешены (время / продолжительность, длина и / или толщина) и анимированы так же, как данные доставки (номер строки - это порядок, в котором речь происходит). Я думаю, что, возможно, пакет анимации может быть полезен здесь, но понятия не имею. Может быть, это нев настоящее время возможно с R (как указано Беном Шмидтомс заявлением "Я"я надеялся, что смогу отказаться от ArcGIS для следующего проекта карты, который я делаю, и сохранить все в R - I 'Я не убежден после этого опыта, что это будет возможно ").

Я думаю, что многие люди во многих областях могли бы использовать этот вид картирования обменов, просто так получается, что яЯ заинтересован в обмене диалогами. В конце концов яЯ бы нарисовал это поверх растрового изображения, но этолегкая часть

Вот'Данные и графики это далеко. Я

#the data
the_table 
 mnel08 мар. 2013 г., 05:16
Что-то вродеgeom_segment(data = talking,aes(x= speaker.x, y= speaker.y, xend = receiver.x, yend = receiver.y, size = duration, colour = speaker), arrow = arrow())
 Tyler Rinker08 мар. 2013 г., 05:13
@mnel Хороший вопрос. Прямо сейчас яЯ начинаю легко / с малого, если предположить, что один человек говорит одновременно. В конце концов яЯ хотел бы перейти к нескольким динамикам одновременно, а динамик - к нескольким приемникам. Но это'это проект. Этот вопрос уже был достаточно большим, поэтому я оставил его маленьким. Но да, предположим, что анимация приходит от одного вектора, появляющегося сразу за другим (строка за строкой).
 Dason08 мар. 2013 г., 05:24
@Marus It 'действительно легко сшить кадры в R с помощью пакета анимации ... тамнет необходимости выходить за пределы R, если выВы способны делать изображения изнутри R.
 Tyler Rinker09 мар. 2013 г., 03:09
@Marus Я узнал, что анимация имеет функцию,saveVideo который использует ffmpeg для создания фильма в формате mp4. Ваше мышление было на правильном пути, но пакет анимации делает намного больше.
 Marius08 мар. 2013 г., 05:17
Если ты'готовы выйти за пределы R, я думаю, что 'Довольно легко объединить файлы изображений в фильм, используя:ffmpegstackoverflow.com/questions/2829113/...
 Tyler Rinker08 мар. 2013 г., 05:05
@GaryЯ знаю про igraph но, насколько мне известно, это не делает анимацию.
 mnel08 мар. 2013 г., 05:09
Откуда берется анимация? Только один человек говорит за один раз, или есть время начала и окончания для каждогоspeech
 Gary Weissman08 мар. 2013 г., 05:02
Попробуйтеigraph пакет
 alexwhan08 мар. 2013 г., 04:53
Вы не могли бы быть, но яя замужем за ggplot2 :)

Ответы на вопрос(1)

Решение Вопроса

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-анимацию и т. д.

 mnel08 мар. 2013 г., 06:10
@Tyler - это было проще, чем я ожидал!
 agstudy19 июн. 2013 г., 12:26
@TylerRinker, чтобы восстановить его после того, как я думаю, что-то вроде.ani.options(oopt)
 Spacedman08 мар. 2013 г., 09:07
Я думаю, что ваша анимация показывает один кадр на обмен, а не 'в режиме реального времени и показывая каждый кадр для длиныduration переменная для этого обмена. Вы хотели позвонитьani.pause(interval) где-то там?
 Tyler Rinker08 мар. 2013 г., 06:06
Хороший ответ. Очень тщательно Анимацию сделать проще, чем я ожидал. Спасибо. Сейчас я'Я начну работать над более сложными обстоятельствами, но мне нужно немного поиграть с этим.
 Tyler Rinker08 мар. 2013 г., 20:26
@mnel есть ли необходимость в этой строкеoopt
 mnel08 мар. 2013 г., 09:45
@ Spacedman, хорошая мысль. Делал продолжительность = размер. Редактировать гораздо лучше (надеюсь, не проверено)

Ваш ответ на вопрос