绘制时间线,同时由同一个人采取行动

时间:2017-02-03 12:28:04

标签: r matplotlib plot gnuplot data-visualization

我希望创建一个时间轴图,其中包含许多可以执行不同操作的不同演员,有时可以同时执行多个操作。作为说明,请参阅此模型:

Illustration of desired layout

该示例说明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 。之后,他们都会回去睡觉。这不是用作公司规划的甘特图,而是用于说明某些群体在任何时候可能采取的不同行动。

1 个答案:

答案 0 :(得分:0)

如果您仍然对此感兴趣,这里有一个使用 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

结果:

enter image description here