可视化

sumo 提供了广泛的输出,但人们可能会发现解析和可视化它们很困难。下面,您可以找到一些工具,用于可视化仿真运行的结果,以便将其包含在科学论文中。其他工具读取纯 .csv 文件,并被添加到套件中,因为它们提供了类似的接口。

所有这些工具都只是围绕出色的 matplotlib 库的包装器。如果您熟悉 Python,一定要看一看。

这些工具共享一组通用选项来微调生成图形的外观。这些选项的名称选择得与 matplotlib 调用相似。

这些工具是用 Python 实现的,需要安装 matplotlib。这些工具可以在 <SUMO_HOME>/tools/visualization 中找到。

当前工具#

下面,您将找到应该与当前 sumo/sumo-gui 生成的输出一起工作的工具的描述。要运行它们,您需要:

  • 安装 Python
  • 安装 matplotlib
  • 设置 <SUMO_HOME>

所有脚本都从命令行执行,您必须提供如下所述的命令行选项。请注意,#通用选项 可以应用于以下小节中列出的所有脚本,尽管某些选项可能对某些脚本不起作用。

plotXMLAttributes.py#

从一个或多个 xml 文件中创建多个 2D 图,这些图包含两个任意属性,并按第三个属性(即检测器 id)进行聚合。

使用示例:

python  tools/visualization/plotXMLAttributes.py -x x -y y fcd.xml
python  tools/visualization/plotXMLAttributes.py -x x -y y fcd.xml fcd2.xml

上面的示例基于 fcd 输出绘制所有车辆通过网络的路径。(这是一个特例,也可以用 plot_trajectories.py 完成)

当设置了选项 --show 时,会打开一个交互式绘图,允许通过点击绘图来识别数据点车辆(dataID 会打印在控制台上)。

选项 --filter-ids ID1,ID2,... 允许将绘图限制为给定的数据元素 id。您可以使用通配符来过滤掉遵循某种模式的 id;例如 --filter-ids bus_* 将过滤掉所有以四个字符 "bus_" 开头的 id。

下面显示了更多示例。其中一些是使用 acosta 场景生成的,这是已发布的 sumo 场景之一 (https://github.com/DLR-TS/sumo-scenarios/tree/main/bologna/acosta)。

绘图样式#

该脚本支持以下不同的绘图样式:

  • lineplot: 默认
  • scatterplot: 使用选项 --scatterplot
  • box plot: 通过设置 --xattr @BOX--yattr @BOX 之一
  • bar plot: 通过设置 --barplot--hbarplot

特殊属性#

以下属性值具有特殊含义。它们不是使用输入文件中的属性,而是基于其他属性派生值。(即,如果特殊属性设置为 --xattr,则其他值由 --yattr 给出)。

  • @INDEX: 使用输入文件中其他值的索引。
  • @FILE: 使用(缩短的)输入文件名(当绘制每个文件一个值时很有用)
  • @RANK: 使用其他值在排序(降序)值列表中的索引。
  • @COUNT: 使用其他值的出现次数。与选项 --barplot-hbarplot 一起使用,这会给出直方图。可以通过选项 --xbin--ybin 设置分箱大小。
  • @DENSITY: 使用其他值的出现次数,按值的总数进行归一化。
  • @BOX: 绘制其他值的一个或多个箱线图--idattr 用于分组,每个 id 将有一个箱线图。
  • @NONE: 可与选项 --idattr 一起使用以显式避免分组。

交互式绘图#

当点击线条或绘图点时,点击位置附近的数据点 id 会打印在控制台上。

过滤#

选项 --filter-ids ID1,ID2,... 允许将绘图限制为给定的数据 id。

在指定过滤器时允许使用通配符 *, ?, []。这根据文件名通配规则工作。

多线绘图#

  • 默认情况下,每个不同的 ID(由 --idattr 定义)将为与该 ID 关联的所有数据点生成一条新线。
  • 如果给出了多个文件,缩写的文件名将成为数据点 ID 的一部分,从而为每个文件的数据创建不同的线或散点。
  • 如果将逗号分隔的值列表传递给选项 --idattr,则每个属性的值将与 | 组合以形成数据点 ID。
  • 如果将逗号分隔的值列表传递给 --xattr--yattr(或两者),并且数据不提供 ID(或设置了选项 --idattr @NONE),则每个单独的 xattr 和 yattr 的组合将创建一条新线。

CSV 输出#

如果需要一个无法使用上述任何方法创建的组合图(即因为数据来自不同类型的数据文件,例如 summary-output 和 edgeData),则另一种方法是使用选项 --csv-output 并使用另一个工具(即 gnuplot)绘制结果数据。

在 csv 输出中,属于同一 ID 的每组数据点将形成自己的块,并与下一个块用两个空行分隔。 要在 gnuplot 中复制每个 ID/块具有不同颜色的绘图,可以使用以下方法:

stats 'data.csv'
plot for [idx=0:STATS_blocks] 'data.csv' i idx with lines

XML 格式假设#

plotXMLAttributes 的默认解析引擎假设每个 xml 元素在输入文件中恰好占一行。这符合所有 SUMO 应用程序的输出格式。 如果要绘制任意 XML 文件(即没有换行符),可以设置选项 --robust-parser。这将降低处理速度。

感应线圈速度随时间变化#

输入是 inductionloop-output,包含来自 2 个检测器的 30 秒聚合(<e1Detector id="e1Detector_-109_0_0" lane="-109_0" pos="54.06" period="30.00" file="data.xml"/>

调用:python tools/visualization/plotXMLAttributes.py data.xml -x begin -y speed -s

车道区域检测器随 nVehEntered 变化#

输入是 laneareadetectors-output,包含来自 6 个检测器的 30 秒聚合

调用:python tools/visualization/plotXMLAttributes.py -x begin -y maxOccupancy -o plot-maxOccupancy.png --legend e2_output.xml --filter-ids e2_0,e2_5,e2_10,e2_15,e2_20,e2_25

多入口出口检测器平均速度随时间变化#

输入是 multi-entry-exit-detector-output,包含 30 秒聚合,并在开始和结束处截断

调用:python tools/visualization/plotXMLAttributes.py -x begin -y meanSpeed detector.xml --legend --xlim 100,5000

每个站点的登车乘客数与延误#

输入是 stop-output

调用:python tools/visualization/plotXMLAttributes.py stopinfos.xml -i busStop -x loadedPersons -y delay --scatterplot --legend

来自 edgeData 的基本图#

输入是 edgeData-output,包含 1 分钟聚合(<edgeData id="example" file="data.xml" period="60"/>

调用:python tools/visualization/plotXMLAttributes.py data.xml -i id -x density -y left --scatterplot --yfactor 60 --ylabel vehs/hour

每种颜色代表不同的 edge-id。选项 --factor 60 用于将车辆/60 秒(edgeData-period 60)转换为车辆/小时。

来自 summary-output 的多个时间线#

输入是 summary。 此图演示了使用属性列表从同一 xml 输入元素生成多个数据点。 在没有 id-attribute 的情况下,相应的属性名称用于“识别”和分组数据点。

调用:python tools/visualization/plotXMLAttributes.py summary.xml -x time -y running,halting -o plot-running.png --legend

注意

在 1.15.0 及更低版本中,必须提供 id-attribute,因此您需要提供一个虚拟值(即使用 -i collisions),并且 x 和 y 属性只允许一个值。

来自 TripInfo 数据的出发延误随时间变化#

该图由 TripInfo 输出数据创建:

调用 python tools/visualization/plotXMLAttributes.py -i id -x depart -y departDelay --scatterplot --xlabel "depart time [s]" --ylabel "depart delay [s]" --ylim 0,40 --xticks 0,1200,200,10 --yticks 0,40,5,10 --xgrid --ygrid --title "depart delay over depart time" --titlesize 16 tripInfo.xml

碰撞时间随仿真时间变化#

该图由 SUMO 仿真输出文件创建,其中添加了全局 SSM 设备。在此示例中,从 Bologna "acosta" 场景 开始,SUMO 配置文件已被修改以计算碰撞时间:

<configuration xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://sumo.dlr.de/xsd/sumoConfiguration.xsd">

    <device.ssm.deterministic value="true"/>
    <device.ssm.file value="ssm.xml"/>
    <device.ssm.measures value="TTC"/>

</configuration>

仿真运行完成后,会生成一个 XML 文件 ssm.xml。使用此文件,我们可以通过命令行提取并绘制 TTC 值:

python.exe .\plotXMLAttributes.py ssm.xml -x time --xlabel "Time [s]" -y value --ylabel "TTC [s]" -i ego --filter-ids bus_* --title "time to collision over simulation time" --scatterplot

排队时间随时间变化#

输入是 queue-output

生成图的调用:

python tools/visualization/plotXMLAttributes.py -x timestep -y queueing_time -o queue.png queue.xml -i id --filter-ids 121_0

其中 -x 是 x 轴的属性;-y 是 y 轴的属性;-o 是输出文件名;-i 是过滤的属性名称(本例中为车道 id);--filter-ids 是过滤属性名称的值(本例中 id = 121_0)。

出发时间与到达时间#

输入是 vehroutes-output

生成图的调用:

python tools/visualization/plotXMLAttributes.py -x depart -y arrival -o vehroute.png vehroute.xml --scatterplot

其中 -x 是 x 轴的属性;-y 是 y 轴的属性;-o 是输出文件名;--scatterplot 是为了制作散点图而不是线图。

前车间隙与速度#

输入是 lanechange-output

生成图的调用:

python tools/visualization/plotXMLAttributes.py -x speed -y leaderGap -o lc.png lanechange.xml -i reason --filter-ids speedGain

其中 -x 是 x 轴的属性;-y 是 y 轴的属性;-o 是输出文件名;-i 是过滤的属性名称(本例中为换道原因);--filter-ids 是过滤属性名称的值(本例中 reason = speedGain)。

所有轨迹随时间变化 1#

输入是 fcd_output

生成图的调用:

python tools/visualization/plotXMLAttributes.py -x x -y y -o allXY_output.png fcd.xml --scatterplot

其中 -x 是 x 轴的属性;-y 是 y 轴的属性;-o 是输出文件名;--scatterplot 是为了制作散点图而不是线图。

选定轨迹随时间变化 1#

输入是 fcd_output

生成图的调用:

python tools/visualization/plotXMLAttributes.py -x x -y y -o vehLocations_output.png fcd.xml -i id --filter-ids Audinot_7_0 --scatterplot --legend

其中 -x 是 x 轴的属性;-y 是 y 轴的属性;-o 是输出文件名;-i 是过滤的属性名称(本例中为车辆 id);--filter-ids 是过滤属性名称的值(本例中 vehicle id = Audinot_7_0);--scatterplot 是为了制作散点图而不是线图;--legend 是为了显示图例。

公共交通时刻表#

注意

工具 plotStops.py 简化了此类时刻表的绘制

在此类图中,时间在 y 轴上,从上到下运行。输入是公共交通时刻表的路线文件,其中每辆车都是单独建模的。 也可以通过使用属性 startedended(或 started,ended)代替 until,从 stop-output 生成类似的图。

生成图的调用:

python tools/visualization/plotXMLAttributes.py route.rou.xml -x busStop -y until --ytime1 --legend --xticks-file stoplist.txt --invert-yaxis --marker o

文件 stoplist.txt 用于定义站点的顺序(对应于它们在运输线路上的顺序),如下所示。 为了将属于同一火车站不同轨道的公交车站分组,它们在 id 中使用了共同的后缀,并且 stoplist.txt 文件使用通配符 (*) 来匹配它们。

*WLA
*KI
*MM
*KX
*LHG

注意

plotStops.py 的主要优点是自动创建 stoplist.txt 文件。

注意

当绘制来自也定义了 <vType> 元素的路线文件的站点时,必须使用选项 --idelem 来声明 id 属性必须从哪里加载(即 --idelem trip)。

随时间变化的转弯计数#

此图使用属性列表作为值 id (-i from,to) 来反映转弯关系由两个属性的组合唯一标识的事实。它还演示了灵活的过滤以显示所有通过边 -40 或边 36 的交通。

生成图的调用:

python tools/visualization/plotXMLAttributes.py turnCounts.xml -i from,to -x begin -y count --xtime0 --legend  --filter-ids="-40|*,36|*"

箱线图:按 departLane 划分的等待时间#

此图演示了单个属性(waitingTime)的箱线图。可选择按类别(departLane)拆分。该调用使用来自两个不同仿真运行的 tripinfo-output 作为其输入。

生成图的调用:

python tools/visualization/plotXMLAttributes.py tripinfos.xml tripinfos2.xml  -x waitingTime -y @BOX -i departLane --show

注意

通过交换 x 属性和 y 属性,可以将箱线图的方向从水平更改为垂直

timeLoss 的直方图#

此图演示了 --barplot 分箱和 @COUNT 的使用,以创建来自两个仿真运行的 timeLoss 值的直方图。 它还显示了如何将数据限制在 300 的上限。

生成图的调用:

plotXMLAttributes.py tripinfos.xml tripinfos2.xml -x timeLoss -y @COUNT -i @NONE --legend  --barplot --xbin 20 --xclamp :300

注意

设置 -i @NONE 很重要,以确保 timeLoss 值按文件而不是按车辆 id 聚合。

plot_trajectories.py#

创建从通过 --fcd-output 生成的文件中获得的所有轨迹的图。此工具特别位于 <SUMO_HOME>/tools 中。

使用示例:

python tools/plot_trajectories.py fcd.xml -t td -o plot.png -s

选项 -t (--trajectory-type) 支持可以相互绘制的不同属性。参数是一个双字母代码,每个字母编码一个从 fcd 输入派生的属性。

注意

plot_trajectories.py 与 plotXMLAttributes.py 类似,但专门用于 fcd-output。它支持加载数据中不存在的派生属性(行驶距离),并且还允许更多过滤(--filter-route, --filter-edges)。

可用属性#

  • t: 时间(秒)
  • d: 行驶距离(从每个车辆的第一个 fcd 数据点开始为 0)。距离基于速度使用欧拉积分计算。设置选项 --ballistic 以使用弹道积分
  • a: 加速度
  • s: 速度 (m/s)
  • i: 车辆角度(导航度)
  • x: X 位置 (m)
  • y: Y 位置 (m)
  • k: 里程(需要 --fcd-output.distance
  • g: 与前车的间隙(需要 --fcd-output.max-leader-distance

轨迹类型示例#

  • td: 时间与距离
  • ts: 时间与速度
  • ta: 时间与加速度
  • ds: 距离与速度
  • da: 距离与加速度
  • xy: 驾驶路径的空间图
  • kt: 里程与时间(与选项 --invert-yaxis 结合使用以获得经典的铁路图)。

加速度与距离#

输入是 fcd-output

生成图的调用:

python tools/plot_trajectories.py -t da -o Plot_trajectories.png fcd.xml

其中 -t 是上述轨迹类型;-o 是输出文件名。

所有轨迹随时间变化 2#

输入是 fcd-output

生成图的调用:

python tools/plot_trajectories.py -t xy -o allLocations_output.png fcd.xml

其中 -t 是上述轨迹类型;-o 是输出文件名。

选定轨迹随时间变化 2#

输入是 fcd-output

生成图的调用:

python tools/plot_trajectories.py -t xy -o selectXY_output.png fcd.xml --filter-ids Audinot_7_0

其中 -t 是上述轨迹类型;-o 是输出文件名;--filter-ids 是过滤属性的值(本例中 id = Audinot_7_0)。

基于 FCD 的速度随时间变化#

输入是 fcd-output

生成图的调用:

python tools/plot_trajectories.py -t ts -o timeSpeed_output.png fcd.xml --filter-ids Audinot_7_0,Costa_12_0,Pepoli_3_0,Silvani_11_0,XXI_APRILE_7_0 --legend

其中 -t 是上述轨迹类型;-o 是输出文件名;--filter-ids 是过滤属性的值(本例中 id 在 [Audinot_7_0, Costa_12_0, Pepoli_3_0, Silvani_11_0, XXI_APRILE_7_0] 中);--legend 是为了显示图例

交互式绘图#

当设置了选项 -s 时,会打开一个交互式绘图,允许通过点击相应的线条来识别车辆(车辆 id 会打印在控制台上)。

过滤#

选项 --filter-route EDGE1,EDGE2,... 允许将绘图限制为包含给定边集的所有轨迹。

选项 --filter-ids ID1,ID2,... 允许将绘图限制为给定的车辆 id

plot_net_dump.py#

plot_net_dump.py 显示一个网络,其中网络边的颜色和宽度取决于定义的边属性。边权重从 "edgedumps" 读取 - edgelane trafficedgelane emissionsedgelane noise

python plot_net_dump.py -v -n bs.net.xml \
--xticks 7000,14001,2000,16 --yticks 9000,16001,1000,16 \
--measures entered,entered --xlabel [m] --ylabel [m] \
--default-width 1 -i base-jr.xml,base-jr.xml \
--xlim 7000,14000 --ylim 9000,16000 -\
--default-width .5 --default-color #606060 \
--min-color-value -1000 --max-color-value 1000 \
--max-width-value 1000 --min-width-value -1000 \
--max-width 3 --min-width .5 \
--colormap "#0:#0000c0,.25:#404080,.5:#808080,.75:#804040,1:#c00000"

它显示了在建立环保区后,不伦瑞克市周二至周四类型的交通变化。

python plot_net_dump.py -v -n bs.net.xml \
--xticks 7000,14001,2000,16 --yticks 9000,16001,1000,16 \
--measures NOx_normed,NOx_normed --xlabel [m] --ylabel [m] \
--default-width 1 -i HBEFA_base-jr.xml,HBEFA_base-jr.xml \
--xlim 7000,14000 --ylim 9000,16000 \
--default-width .5 --default-color #606060 \
--min-color-value -.1 --max-color-value .1 \
--max-width-value .1 --max-width 3 --min-width .5 \
--colormap "#0:#00c000,.25:#408040,.5:#808080,.75:#804040,1:#c00000"

显示 NOx 排放的相应变化。

  • --dump-inputs <FILE>,<FILE>--measures <STRING>,<STRING> 都期望两个条目,用 ',' 分隔。第一个用于边的颜色,第二个用于它们的宽度。但您可以简单地跳过一个条目。然后,使用默认值。
  • dump 文件通常覆盖多个间隔。要为每个间隔生成一个额外的输出文件,请在输出文件名中使用字符串 '%s'(此部分将被相应的开始时间替换)。

注意

如果给出了两个输入文件,它们必须覆盖相同的时间间隔,否则将不会绘制任何数据。

选项

这里列出了最重要的选项。使用 --help 查看所有选项。

选项 描述
-n <FILE>
--net <FILE>
定义要读取的网络
-i <FILE>,<FILE>
--dump-inputs <FILE>,<FILE>
定义要用作输入的 dump-output 文件
-m <STRING>,<STRING>
--measures <STRING>,<STRING>
定义要绘制的度量;默认值: speed,entered
-w <FLOAT>
--default-width <FLOAT>
定义默认边宽度;默认值: .1
-c <COLOR>
--default-color <COLOR>
定义默认边颜色
--min-width <FLOAT> 定义最小边宽度;默认值: .5
--max-width <FLOAT> 定义最大边宽度;默认值: 3
--log-colors 如果设置,颜色按对数缩放
--log-widths 如果设置,宽度按对数缩放
--min-color-value <FLOAT> 如果设置,定义最小边颜色值
--max-color-value <FLOAT> 如果设置,定义最大边颜色值
--min-width-value <FLOAT> 如果设置,定义最小边宽度值
--max-width-value <FLOAT> 如果设置,定义最大边宽度值
-v
--verbose
如果设置,进度将打印在屏幕上
--internal 如果设置,内部边(路口的)将包含在生成的形状中。

plot_net_selection.py#

plot_net_selection.py 读取一个道路网络和一个由 sumo-gui 写入的选择文件。它绘制道路网络,为选择中的边(选择中至少有一条车道的所有边)选择不同的颜色和宽度。

python plot_net_selection.py -n bs.net.xml \
--xlim 7000,14000 --ylim 9000,16000 \
-i selection_environmental_zone.txt \
--xlabel [m] --ylabel [m] \
--xticks 7000,14001,2000,16 --yticks 9000,16001,1000,16 \
--selected-width 1 --edge-width .5 -o selected_ez.png \
--edge-color #606060 --selected-color #800000

该示例显示了“环保区”的选择。

选项

选项 描述
-n <FILE>
--net <FILE>
定义要读取的网络
-i <FILE>
--selection <FILE>
定义要读取的选择文件
--selected-width <FLOAT> 定义选定边的宽度;默认值: 1
--selected-color <COLOR> 定义选定边的颜色;默认值: r (红色)
--edge-width <FLOAT> 定义默认边宽度;默认值: .2
--edge-color <COLOR> 定义默认边颜色;默认值: #606060
-v
--verbose
如果设置,进度将打印在屏幕上

plot_net_speeds.py#

plot_net_speeds.py 读取一个道路网络,并使用允许的速度为边着色。它更像是使用从网络文件读取的度量的一个示例。

python plot_speeds.py -n bs.net.xml --xlim 1000,25000 \
--ylim 2000,26000 --edge-width .5 -o speeds2.png \
--minV 0 --maxV 60 --xticks 16 --yticks 16 \
--xlabel [m] --ylabel [m] --xlabelsize 16 --ylabelsize 16 \
--colormap jet

该示例按其最大允许速度为德国不伦瑞克的街道着色。

选项

选项 描述
-n <FILE>
--net <FILE>
定义要读取的网络
--edge-width <FLOAT> 定义默认边宽度;默认值: .2
--edge-color <COLOR> 定义默认边颜色;默认值: #606060
--minV <FLOAT> 定义最小值边界
--maxV <FLOAT> 定义最大值边界
-v
--verbose
如果设置,脚本会说明它在做什么

plot_net_trafficLights.py#

plot_net_trafficLights.py 读取一个道路网络并绘制它,此外还在属于网络的交通灯位置添加点/标记。

python plot_trafficLights.py -n bs.net.xml \
--xlim 1000,25000 --ylim 2000,26000 --edge-width .5 \
--xticks 16 --yticks 16 --xlabel [m] --ylabel [m] \
--xlabelsize 16 --ylabelsize 16 --width 5 \
--edge-color #606060

该示例显示了不伦瑞克的交通灯。

选项

选项 描述
-n <FILE>
--net <FILE>
定义要读取的网络
--edge-width <FLOAT> 定义默认边宽度;默认值: .2
--edge-color <COLOR> 定义默认边颜色;默认值: #606060
--minV <FLOAT> 定义最小值边界
--maxV <FLOAT> 定义最大值边界
-v
--verbose
如果设置,脚本会说明它在做什么

plot_summary.py#

plot_summary.py 读取一个或多个 summary-files 并绘制选定的度量(读取的 summary-files 的属性)。该度量作为沿仿真时间的时间线进行可视化。

python plot_summary.py
-i mo.xml,dido.xml,fr.xml,sa.xml,so.xml \
-l Mo,Di-Do,Fr,Sa,So --xlim 0,86400 --ylim 0,10000
-o sumodocs/summary_running.png --yticks 0,10001,2000,14 \
--xticks 0,86401,14400,14 --xtime1 --ygrid \
--ylabel "running vehicles [#]" --xlabel "time" \
--title "running vehicles over time" --adjust .14,.1

该示例显示了不伦瑞克市大规模场景中,标准工作日类别下一天中运行的车辆数量。“mo.xml”、“dido.xml”、“fr.xml”、“sa.xml”和“so.xml”是分别来自周一、周二至周四、周五、周六和周日类型仿真的 summary-files

选项

选项 描述
-i <FILE>[,<FILE>]*
--summary-inputs <FILE>[,<FILE>]*
定义要读取的 summary-file
-m <STRING>
--measure <STRING>
定义要从 summary 文件读取的度量;默认值: running
-v
--verbose
如果设置,进度将打印在屏幕上
--dpi <FLOAT> 定义图形的 dpi 分辨率;默认值: None

plot_tripinfo_distributions.py#

plot_tripinfo_distributions.py 读取一个或多个 tripinfo-files 并绘制选定的度量(读取的 tripinfo-files 的属性)。该度量作为垂直条形图进行可视化,这些条形图代表落入一个分箱的度量(车辆)的出现次数。

python plot_tripinfo_distributions.py \
-i mo.xml,dido.xml,fr.xml,sa.xml,so.xml \
-o tripinfo_distribution_duration.png -v -m duration \
--minV 0 --maxV 3600 --bins 10 --xticks 0,3601,360,14 \
--xlabel "duration [s]" --ylabel "number [#]" \
--title "duration distribution" \
--yticks 14 --xlabelsize 14 --ylabelsize 14 --titlesize 16 \
-l mon,tue-thu,fri,sat,sun --adjust .14,.1 --xlim 0,3600

该示例显示了不同工作日类别车辆的行程时间分布(不伦瑞克场景)。“mo.xml”、“dido.xml”、“fr.xml”、“sa.xml”和“so.xml”是分别来自周一、周二至周四、周五、周六和周日类型仿真的 tripinfo-files

python plot_tripinfo_distributions.py -i tripinfo.xml -o stopCountDist.png \
--measure waitingCount --bins 10 --maxV 10 \
--xlabel "number of stops [-]" --ylabel "count [-]" \
--title "distribution of number of stops" --colors blue -b --no-legend

该示例显示了车辆在行程中必须停站的次数分布。停站次数超过 9 次的车辆被添加到直方图的最后一个分箱中。

选项

选项 描述
-i <FILE>[,<FILE>]*
--tripinfos-inputs <FILE>[,<FILE>]*
定义要读取的 summary-file
-m <STRING>
--measure <STRING>
定义要从 summary 文件读取的度量
-v
--verbose
如果设置,进度将打印在屏幕上
--bins <INT> 将值划分为的分箱数量
--norm <FLOAT> 定义一个数字,读取的值将除以该数字;默认值: 1.0
--minV <FLOAT> 最小值;如果设置,低于此值的读取值将设置为此值
--maxV <FLOAT> 最大值;如果设置,高于此值的读取值将设置为此值

plot_csv_timeline.py#

plot_csv_timeline.py 读取一个 .csv 文件,并使用 --columns <INT>[,<INT>]* 选项绘制选定的列。这些值作为线条进行可视化。

plot_csv_timeline.py \
-i nefz.csv -c 1 --no-legend --xlabel "time [s]" \
--ylabel "velocity [km/h]" --xlabelsize 14 --ylabelsize 14 \
--xticks 14 --yticks 14 --colors k --ylim 0,125 \
--output nefz.png \
--title "New European Driving Cycle (NEDC)" --titlesize 16

该示例显示了 新欧洲驾驶循环 (NEDC)

选项

选项 描述
-i <FILE>
--input <FILE>
定义要使用的输入文件
-c <INT>[,<INT>]*
--columns <INT>[,<INT>]*
定义要绘制的列
-v
--verbose
如果设置,进度将打印在屏幕上

plot_csv_pie.py#

plot_csv_pie.py 读取一个 .csv 文件,该文件被假定在第一列包含名称,在第二列包含相应的值。读取的名称/值对作为饼图进行可视化。

plot_csv_pie.py \
-i paradigm.csv -b --colormap Accent --no-legend -s 6,6



注意: 请注意,您应该使用 --size <FLOAT>,<FLOAT> 选项将宽度和高度设置为相同的值,参见#通用选项。否则您会得到一个椭圆形。

选项

选项 描述
-i <FILE>
--input <FILE>
定义要读取的输入文件
-p
--percentage
将读取的度量解释为百分比
-r
--revert
在绘制之前反转读取值的顺序
--no-labels 不绘制标签
--shadow 在圆圈下方放置阴影
--startangle <FLOAT> 设置起始角度
-v
--verbose
如果设置,进度将打印在屏幕上

plot_csv_bars.py#

plot_csv_bars.py 读取一个 .csv 文件,该文件被假定在第一列包含名称,在第二列包含相应的值。读取的名称/值对作为条形图进行可视化。

plot_csv_bars.py \
-i nox_effects.txt --colormap RdYlGn --no-legend --width .4 \
-s 8,4 --revert --xlim 0,50 --xticks 0,51,10,16 --yticks 16 \
--adjust .28,.1,.95,.9 --show-values

选项

选项 描述
-i <FILE>
--input <FILE>
定义要用作输入的 csv 文件
-x <INT>
--column <INT>
定义要绘制的读取 .csv 文件的哪一列;默认值: 1
-r
--revert
在绘制之前反转读取值的顺序
-w <FLOAT>
--width <FLOAT>
定义条形的宽度;默认值: .8
--space <FLOAT> 定义条形之间的空间;默认值: .2
--norm <FLOAT> 定义一个数字,读取的值将除以该数字;默认值: 1.0
--show-values 显示值
--values-offset <FLOAT> 值的位置偏移
--vertical 绘制垂直条形(默认是水平条形)
--no-labels 不绘制标签
-v
--verbose
如果设置,进度将打印在屏幕上

macrOutput.py#

此工具将 EdgeData 输出绘制为基本图(体积-密度、速度-密度和体积-速度关系,每个边和车道)。 这要求 EdgeData 输入文件具有包含 sampledSecondsdensitylaneDensityspeed 属性的间隔数据。该工具支持通用选项。不过,输出被解释为目录而不是文件。输出文件名如下:

  • Edge_vk.png (速度-密度关系)
  • Edge_qk.png (体积-密度关系)
  • Edge_qv.png (体积-速度关系)
  • Lane_vk.png (速度-密度关系)
  • Lane_qk.png (体积-密度关系)
  • Lane_qv.png (体积-速度关系)

示例调用:python macrOutput.py edgeData.xml

通用选项#

以下选项是所有先前列出的工具通用的。它们可以分为两组:

  • 用于格式化图形的选项(包括添加标题等)
  • 用于确定如何处理生成图形的选项

这些选项分别在以下小节中列出和讨论。

格式化选项#

选项 描述
--colors <COLOR> 使用给定的颜色;给定的颜色数量必须与要绘制的度量数量相同
--colormap <STRING> 使用命名的颜色映射
--labels <LABELS>
-l <LABELS>
使用给定的标签;给定的标签数量必须与要绘制的度量数量相同
--xlim <XMIN>,<XMAX> 描述图形沿 x 轴的限制
--ylim <YMIN>,<YMAX> 描述图形沿 y 轴的限制
--xticks <XMIN>,<XMAX>,<XSTEP>,<XSIZE>
--yticks <XSIZE>
如果只给出一个数字,则将其解释为 x 轴上刻度标签的大小;如果给出四个数字,则分别解释为最低刻度位置、最高刻度位置、刻度之间的步长以及刻度的大小,所有这些都沿 x 轴
--yticks <XMIN>,<XMAX>,<XSTEP>,<XSIZE>
--yticks <XSIZE>
如果只给出一个数字,则将其解释为 y 轴上刻度标签的大小;如果给出四个数字,则分别解释为最低刻度位置、最高刻度位置、刻度之间的步长以及刻度的大小,所有这些都沿 y 轴
--xtime0 如果设置,沿 x 轴的刻度标签将格式化为时间条目 (hh)
--ytime0 如果设置,沿 y 轴的刻度标签将格式化为时间条目 (hh)
--xtime1 如果设置,沿 x 轴的刻度标签将格式化为时间条目 (hh:mm)
--ytime1 如果设置,沿 y 轴的刻度标签将格式化为时间条目 (hh:mm)
--xtime2 如果设置,沿 x 轴的刻度标签将格式化为时间条目 (hh:mm:ss)
--ytime2 如果设置,沿 y 轴的刻度标签将格式化为时间条目 (hh:mm:ss)
--xgrid 如果设置,将沿 x 轴的刻度绘制网格
--ygrid 如果设置,将沿 y 轴的刻度绘制网格
--xticksorientation <FLOAT> x 刻度的方向(度);默认值: matplotlib 默认
--yticksorientation <FLOAT> y 刻度的方向(度);默认值: matplotlib 默认
--xlabel <STRING> 定义为 x 轴设置的标签
--ylabel <STRING> 定义为 y 轴设置的标签
--xlabelsize <FLOAT> 定义 x 轴标签的大小
--ylabelsize <FLOAT> 定义 y 轴标签的大小
--marker <STRING> Matplotlib 绘制点的标记样式;默认值: 'o' 表示散点图中的点,否则不使用
--linestyle <STRING> Matplotlib 绘制线的线型;默认值: '-' 表示连续线
--title <STRING> 定义图形的标题
--titlesize <FLOAT> 定义标题的大小
--adjust <FLOAT>,<FLOAT>
--adjust <FLOAT>,<FLOAT>,<FLOAT>,<FLOAT>
调整绘图;如果给出两个浮点数,则解释为左和下值,如果给出四个数字,则解释为左、下、右、上
--size <FLOAT>,<FLOAT> 定义图形的大小
--no-legend 如果设置,不绘制图例
--legend-position <STRING> 定义图例的位置;默认值: matplolib 默认
--alpha <FLOAT> 定义绘图背景的不透明度,范围从 0=完全透明到 1=不透明;默认值: 1

交互选项#

如果其中一个脚本只是在没有下面列出的选项的情况下启动,图形将被显示。要将图形额外写入文件,必须使用 --output <FILE>(或简写 -o <FILE>)给出要生成的文件名。

如果脚本在批处理文件中运行,显示图形通常不方便(一旦知道它符合要求)。在这种情况下,可以使用选项 --blind (-b) 来抑制显示图形。

选项 描述
-o <FILE>
--output <FILE>
定义保存图形的名称
-b
--blind
如果设置,将不显示图形

其他可视化方法#

sumo-gui 中根据任意数据为边着色和缩放#

sumo-gui 可以加载 edgeData 文件 并使用其中任何属性的值为边(道路)着色以及修改边的视觉宽度。这服务于与 plot_net_dump.py 类似的用例,但允许使用 sumo-gui 的所有动态缩放和平移功能。

在逐步进行仿真时,可以显示权重文件中包含的不同时间间隔。将仿真步长调整为数据周期以方便步进可能很有用:

sumo-gui -n NET --edgedata-files FILE --step-length 3600 --end 24:0:0

之后,您需要进行以下设置:

  • 选择 "edgeData" 进行着色:

1

  • 选择数据类型并重新校准着色的间隔阈值:

2

  • 设置颜色边图例(可选):

3

关于 "Recalibrate Rainbow",它是使用当前步骤中读取的数据完成的。因此,在单击 "Recalibrate Rainbow" 之前,可能需要运行一些步骤来获取数据。此外,如果使用另一个步骤的数据,结果可能会不同。或者,您可以 (1) 直接在 "Recalibrate Rainbow" 图标旁边设置最小值和最大值,或者 (2) 手动设置每个间隔的间隔阈值。

交叉口流量图#

要可视化交叉口的流量,其中线宽与交通量成正比,可以使用工具 route2poly.py

  1. 使用 netedit 选择一个或多个交叉口的所有边,这些边的流量将被可视化,并将选择保存到文件(例如 sel.txt
  2. 生成宽度与通过选定边的车辆数量成正比的多边形。当设置 --scale-width to 0.01 时,100 辆使用相同边序列的车辆将对应于 1m 的多边形宽度。选项 --spread 用于防止生成的多边形重叠,应根据多边形宽度进行调整。

      route2poly.py NET routes.rou.xml -o flows.poly.xml --filter-output.file sel.txt --scale-width 0.01 --internal --spread 1 --hue cycle
    
  3. sumo-gui 中可视化流量

      sumo-gui -n NET -a flows.poly.xml
    

将 FCD 数据可视化为移动的 POI#

工具 fcdReplay.py 可用于在 sumo-gui 中重放 fcd-output 文件

使用示例:

python  tools/fcdReplay.py -k example.sumocfg -f fcd.xml

要使用带有 lon/lat 值的 fcd 数据(使用 sumo 选项 --fcd-output.geo 生成),必须设置选项 --geo

过时的#

这些工具的命名方式如下:<API>__<DESCRIPTION>.py,其中:

  • <API>: mpl 表示 matplotlib
  • : 处理的 SUMO 输出(主要是)
  • <DESCRIPTION>: 工具的功能

mpl_dump_twoAgainst.py#

读取两个 dump 文件(强制选项 --dump1 <FILE>--dump2 <FILE>,或简写 -1 <FILE>-2 <FILE>)。提取由 --value 描述的值(默认值: speed)。绘制 dump2 的值与 dump1 的相应(相同间隔时间和边)值的关系图。

--show 设置时显示绘图,或者当 --output <FILE> 设置时将其保存到文件。

您可以使用 (--join) 额外绘制值的归一化和。否则,您可以尝试使用 --time-coloring 为读取的间隔分配不同的颜色。

您可以使用 --xticks <XMIN,XMAX,XSTEP,FONTSIZE>--yticks <YMIN,YMAX,YSTEP,FONTSIZE> 格式化轴,并使用 --xlim <XMIN,XMAX>--ylim <YMIN,YMAX> 设置它们的限制。可以使用 --size <WIDTH,HEIGHT> 设置图像的输出大小。

mpl_tripinfos_twoAgainst.py#

读取两个 tripinfos 文件(强制选项 --tripinfos1 <FILE>--tripinfos2 <FILE>,或简写 -1 <FILE>-2 <FILE>)。提取由 --value 描述的值(默认值: duration)。绘制 tripinfos2 的值与 tripinfos1 的相应(相同车辆)值的关系图。

--show 设置时显示绘图,或者当 --output <FILE> 设置时将其保存到文件。

您可以使用 --xticks <XMIN,XMAX,XSTEP,FONTSIZE>--yticks <YMIN,YMAX,YSTEP,FONTSIZE> 格式化轴,并使用 --xlim <XMIN,XMAX>--ylim <YMIN,YMAX> 设置它们的限制。可以使用 --size <WIDTH,HEIGHT> 设置图像的输出大小。

mpl_dump_timeline.py#

从通过 --dumps <DUMP>[,<DUMP>]* 定义的 dump 中读取由 --edges <EDGEID>[,<EDGEID>]* 定义的边的值(给定为 --value <VALUE>,默认速度)。使用通过 --colors <MPL_COLOR>[,<MPLCOLOR>]* 定义的颜色将它们绘制为时间线。请注意,颜色数量必须等于边数 * dump 数。

--show 设置时显示绘图,或者当 --output <FILENAME> 设置时将其保存到文件。

您可以使用 --xticks <XMIN,XMAX,XSTEP,FONTSIZE>--yticks <YMIN,YMAX,YSTEP,FONTSIZE> 格式化轴,并使用 --xlim <XMIN,XMAX>--ylim <YMIN,YMAX> 设置它们的限制。可以使用 --size <WIDTH,HEIGHT> 设置图像的输出大小。

mpl_dump_onNet.py#

读取一个网络(使用 --net-file <NET>-n <NET> 定义)和一个边 dump 文件(--dump <DUMPFILE>-d <DUMP_FILE>)。使用从 <NET> 读取的几何形状绘制网络。每条边使用的宽度和颜色都使用 --value <WIDTHVALUE>,<COLORVALUE> 确定,其中 <WIDTHVALUE> 和 <COLORVALUE> 都是 dump 文件中存在的、每条边都有的属性。

您可以通过设置 --color-map <DEFINITION> 来更改使用的颜色映射。<DEFINITION> 由排序的值列表(介于 0 和 1 之间)和分配的颜色组成。这意味着默认的 0:#ff0000,.5:#ffff00,1:#00ff00 让具有低 <COLORVALUE> 值的街道显示为红色,中间的显示为黄色,具有高值的显示为绿色。对于给定值之间的值,颜色使用线性插值确定。请注意,只能使用小写十六进制字符。

--show 设置时显示绘图,或者当 --output <FILENAME> 设置时将其保存到文件。

--join 将每条边找到的值相加,并将结果除以这些值的数量。如果未设置 join 并且给出了 --output,则应选择如下所示的输出名称:<NAME>'%05d.png。%05d 将被写入的当前时间步替换。

如果您通过不“连接”(聚合)数据生成了一组图像,可以使用 ImageMagick 和以下命令将获得的图片转换为动画 gif:

convert -delay 20 *.png -loop 0 animation.gif

(loop 0 表示动画在结束后从头开始重复)

您可以使用 --xticks <XMIN,XMAX,XSTEP,FONTSIZE>--yticks <YMIN,YMAX,YSTEP,FONTSIZE> 格式化轴,并使用 --xlim <XMIN,XMAX>--ylim <YMIN,YMAX> 设置它们的限制。可以使用 --size <WIDTH,HEIGHT> 设置图像的输出大小。