如何用MediaWiki与SRF生成含零值计数的折线图
解决Semantic MediaWiki折线图显示全年份(含0产量)的方案
默认的jqplotchart+distribution参数只会统计存在数据的年份,要补全1990-2000的所有年份并显示0产量,核心思路是主动遍历目标年份范围,对每个年份单独统计产量,再将结果整合为图表所需格式。以下是三种可行方案:
方案一:数组遍历+批量查询(通用兼容版)
通过#set定义年份范围,结合#arraymap遍历每个年份并查询对应产量,最后生成完整的图表数据:
{{#set: |Years=1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000 }} {{#arraymap: {{#show: {{PAGENAME}} |?Years}} |, | $year | {{#ask: [[Color::Red]] [[Year::{{$year}}]] |format=count }} |, | $count | {{$year}}:{{$count}} |; | $pair | [{{$pair}}] |, }} {{#jqplotchart: |data=[上面生成的数组] |charttype=line |xaxis=1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000 |ylabel=产量 |title=1990-2000年红色物品产量 }}
说明
- 先用
#set将目标年份范围存储到当前页面的Years属性 #arraymap遍历每个年份,调用#ask的count格式获取对应年份的红色物品数量- 将年份与数量拼接为
年份:数量的格式,整理成图表所需的数组结构 - 手动指定
xaxis参数为完整年份列表,确保无数据年份不被省略
方案二:聚合函数+JSON关联(SMW新版本适用)
如果你的SMW版本支持#aggregate函数,可以先批量统计有数据年份的产量,再关联完整年份范围补全0值:
{{#aggregate: |query=[[Color::Red]] |group by=Year |count=?Year |format=json |limit=100 |store=year_counts }} {{#arraymap: {{#range:1990|2000}} |, | $year | {{#jsonpath: {{#show: {{PAGENAME}} |?year_counts}} | $.[?(@.key == "{{$year}}")].count | default=0 }} |, | $count | {{$year}}:{{$count}} |; | $pair | [{{$pair}}] |, }} {{#jqplotchart: |data=[上面生成的数组] |charttype=line |xaxis={{#range:1990|2000}} |ylabel=产量 |title=1990-2000年红色物品产量 }}
说明
#aggregate统计所有有数据年份的产量,结果以JSON格式存储到year_counts属性#range生成1990-2000的完整年份数组#jsonpath从存储的JSON中提取对应年份的产量,无数据时默认返回0- 最终生成包含全年份数据的折线图
方案三:模板辅助(直观易维护版)
创建一个可复用的产量统计模板,手动列出所有年份并调用模板查询:
第一步:创建模板Year产量统计
{{#ask: [[Color::Red]] [[Year::{{{year}}}]] |format=count }}
第二步:主页面调用生成图表
{{#jqplotchart: |data=[ [1990:{{Year产量统计|year=1990}}], [1991:{{Year产量统计|year=1991}}], [1992:{{Year产量统计|year=1992}}], [1993:{{Year产量统计|year=1993}}], [1994:{{Year产量统计|year=1994}}], [1995:{{Year产量统计|year=1995}}], [1996:{{Year产量统计|year=1996}}], [1997:{{Year产量统计|year=1997}}], [1998:{{Year产量统计|year=1998}}], [1999:{{Year产量统计|year=1999}}], [2000:{{Year产量统计|year=2000}}] ] |charttype=line |xaxis=1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000 |ylabel=产量 |title=1990-2000年红色物品产量 }}
说明
- 模板封装了单年份的产量查询逻辑,无数据时自动返回0
- 手动列出所有年份并传入模板,确保每个年份都有对应的产量数据
- 配置
xaxis为完整年份列表,保证X轴显示所有目标年份
注意事项
- 若使用
#range或#aggregate,需确保你的SMW版本支持这些函数,旧版本可能需要升级 - 所有方案的核心都是主动覆盖1990-2000的全部年份,而非依赖查询自动返回的有数据条目,这是补全0产量的关键
内容的提问来源于stack exchange,提问作者Nahdi Lazar
相关产品推荐
相关产品推荐

