【问题标题】:Plotting timeline with concurrent action by same person绘制同一个人同时采取行动的时间线
【发布时间】:2017-06-20 19:54:51
【问题描述】:

我希望创建一个包含许多不同演员的时间线图,这些演员可以执行不同的动作,有时同时有多个动作。作为示例,请参阅此模型:

该示例说明 P1 和 P2 从 0:00 到 5:00 都执行活动 1。然后,P1 可以在 5:00 到 17:00 之间选择活动 2 和 3,而 P2 有三个选择,其中一些也会随着时间而变化。

如何使用任意开源工具绘制数据,最好是 GNUPlot(但 R 或 matplotlib 也可以)创建这样的图?

我见过许多类似的问题(123456),但它们都没有解决并发操作的问题同一个演员。

上下文:系统将用于可视化整个群体的潜在行为。所以,举个不好的例子,如果一组是“学生”,那么他们可能都从0:00到05:00睡觉,然后要么在家工作,要么在大学工作到17:00。之后,他们都会回去睡觉。这不是为了用作公司规划的甘特图,而是为了说明某些人群在任何时候可能采取的不同行动。

【问题讨论】:

  • stackoverflow.com/questions/3550341/gantt-charts-with-r。还有时间线和时间线包。
  • @G.Grothendieck 谢谢!我目前正在研究它,我遇到的主要问题是甘特图的显示样式,其中新事件一直向下进行,这对于我想要绘制的 7 天间隔占用太多空间。不过,timevis + groups 可能会起作用。我会调查的。随意把它变成一个答案,这样我就可以在我确认它确实解决了我的问题后接受它:)

标签: r matplotlib plot gnuplot data-visualization


【解决方案1】:

如果这仍然感兴趣,这里有一个使用 gnuplot 的建议。

第 1 列包含此人。第 2 列包含 . 之前的拆分数和 . 之后的索引(这也可以拆分为两列)。第 3 列是用于颜色的活动,第 4 列和第 5 列分别是开始和结束时间。

这当然可以改进,但可以作为进一步优化或适应的起点。

代码:(用 gnuplot 5.2.8 测试)

### split time chart
reset session

$Data <<EOD
P1  3.2  A1  2021-01-05_00:00  2021-01-05_05:00
P1  2.1  A2  2021-01-05_05:00  2021-01-05_17:00
P1  2.2  A3  2021-01-05_05:00  2021-01-05_17:00
P1  3.2  A1  2021-01-05_17:00  2021-01-06_00:00
P2  3.2  A1  2021-01-05_00:00  2021-01-05_05:00
P2  3.1  A2  2021-01-05_05:00  2021-01-05_13:00
P2  3.1  A3  2021-01-05_13:00  2021-01-05_17:00
P2  3.2  A4  2021-01-05_05:00  2021-01-05_13:00
P2  3.2  A5  2021-01-05_13:00  2021-01-05_17:00
P2  3.3  A6  2021-01-05_05:00  2021-01-05_17:00
P2  3.2  A1  2021-01-05_17:00  2021-01-06_00:00
EOD

myTimeFmt = "%Y-%m-%d_%H:%M"
myActivity(col) = int(strcol(col)[2:])
myPerson(col) = int(strcol(col)[2:])
BoxHeight = 0.6
SubBoxCount(colBoxes) = int(strcol(colBoxes)[1:strstrt(strcol(colBoxes),'.')-1])
SubBoxIndex(colBoxes) = int(strcol(colBoxes)[strstrt(strcol(colBoxes),'.')+1:] -1)
SubBoxHeight(colBoxes) = BoxHeight/SubBoxCount(colBoxes)
BoxWidth(colStart,colEnd) = (timecolumn(colEnd,myTimeFmt)-timecolumn(colStart,myTimeFmt))/2.
BoxPosX(colStart,colEnd) = (timecolumn(colStart,myTimeFmt)+timecolumn(colEnd,myTimeFmt))/2.
BoxPosY(colPerson,colBoxes) = myPerson(colPerson) - 0.5 + (1.-BoxHeight)/2 + \
            SubBoxHeight(colBoxes)*(SubBoxIndex(colBoxes) + 0.5)

set format x "%H:%M" timedate
set grid xtics
set yrange [:] reverse
set offsets 0.25, 0.25, 0.25, 0.25
set ytics 1
set style fill transparent solid 0.5
set key out

plot $Data u (BoxPosX(4,5)):(BoxPosY(1,2)):(BoxWidth(4,5)):(SubBoxHeight(2)/2.):(myActivity(3)) w boxxy lc var notitle, \
     '' u (NaN):(myPerson(1)):ytic(1) notitle, \
     for [i=1:6] '' u (NaN):(0):(0):(0):(i) w boxxy lc var ti sprintf("A%d",i)
### end of code

结果:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 2016-07-27
    • 2015-05-17
    • 2013-04-01
    • 2023-02-13
    相关资源
    最近更新 更多