我希望创建一个时间轴图,其中包含许多可以执行不同操作的不同演员,有时可以同时执行多个操作。作为说明,请参阅此模型:
该示例说明P1和P2都从0:00到5:00执行活动1。 P1然后可以在5:00到17:00之间选择活动2和3,而P2有三种选择,其中一些也随着时间的推移而变化。
如何使用任意开源工具创建这样的图来绘制数据,理想情况下GNUPlot(但R或matplotlib也可以)?
我已经看过许多类似的问题(1,2,3,4,5,6 ),但他们都没有解决同一个演员同时行动的问题。
上下文:系统将用于显示整组人员的潜在行动。所以,举个不好的例子,如果一个小组是"学生",那么他们可能都会从0:00到05:00睡觉,然后在家工作或在大学工作到17:00 。之后,他们都会回去睡觉。这不是用作公司规划的甘特图,而是用于说明某些群体在任何时候可能采取的不同行动。
答案 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
结果: