Apache ECharts是一個基於JavaScript的開源可視化圖表庫。[1]通過它,你可以輕鬆地在網站上繪製各種圖表。
進入正題。令人高興的是,萌百上已經有了渲染ECharts圖表的模板——{{Echart}}。本頁面將簡單介紹如何使用該模板繪製一個展示用戶每月編輯歷史的折線圖。為了方便後文介紹,先放出成品:
"title": {
"text": "我的編輯歷史",
"subtext": "按月統計次數",
"subtextStyle": {
"color": "#333"
}
},
"tooltip": {
"trigger": "axis",
"axisPointer": {
"type": "cross",
"animation": false
}
},
"toolbox": {
"show": true,
"feature": {
"dataZoom": {
"yAxisIndex": "none"
},
"dataView": {
"readOnly": true
},
"magicType": {
"type": [
"line",
"bar"
]
},
"restore": {},
"saveAsImage": {
"excludeComponents": [
"toolbox",
"dataZoom"
]
}
}
},
"axisPointer": {
"link": {
"xAxisIndex": "all"
}
},
"dataZoom": [
{
"type": "inside",
"xAxisIndex": [
0
],
"startValue": 0,
"end": 100
},
{
"show": true,
"xAxisIndex": [
0
],
"type": "slider",
"start": 0,
"end": 100
}
],
"legend": {
"data": [
"編輯次數"
]
},
"xAxis": {
"data": [
"2021年3月",
"2021年4月",
"2021年5月"
]
},
"yAxis": {},
"series": [
{
"name": "編輯次數",
"type": "line",
"label": {
"formatter": "{c}",
"distance": 0,
"backgroundColor": "transparent",
"padding": 1
},
"data": [
{
"value": 572,
"label": {
"show": false
}
},
{
"value": 312,
"label": {
"show": true,
"position": "bottom"
}
},
{
"value": 290,
"label": {
"show": false
}
}
],
"markPoint": {
"data": [
{
"type": "max",
"name": "最大值"
},
{
"type": "min",
"name": "最小值"
}
],
"silent": true
},
"markLine": {
"data": [
{
"type": "average",
"name": "平均值"
}
],
"silent": true
}
}
],
"animation": false
}下面針對該實例進行介紹。
為了實現類似於上面的效果,我們需要一個用於模板接收數據的頁面(以下簡稱「數據頁面」),頁面內容模型必須為JSON。
實際上,在使用ECharts繪製圖表之前需要在伺服器端進行一定的配置,但這些都已經預先準備好了。我們可以自定義的部分是一個被稱為setOption的函數。該函數用於設置圖表實例的配置項以及數據,所有參數和數據的修改都可以通過其完成。[2]
可以認為模板已定義好的內容大致為:
<div class="echart-app">
<div class="echart-data">
<!-- 此處為從數據頁面接收的數據 -->
</div>
<div class="echart-main">
<div>
<canvas></canvas>
</div>
</div>
</div>
其中echart-data對應<div>中的內容即為數據頁面中的內容,也就是我們需要重點編寫的。
與創建一般的用戶子頁面相同,您可以通過在搜索框輸入User:您的用戶名/數據頁面名稱創建,也可在下方輸入框中輸入您想要的數據頁面名稱後點擊右側按鈕創建(這裡數據頁面名稱默認取contributions):
目前普遍採用手動統計的方式獲取數據。即轉到您的貢獻頁面,選定好起止日期[3]後統計。當然,當數目較大時,可以通過複製當月的貢獻記錄,然後粘貼到可以顯示行數的文本編輯器(例如開啟狀態欄的Windows Notepad,whatever)以減少工作量。
可以考慮使用諸如Visual Studio Code的代碼編輯器編寫JSON文件,再粘貼到您剛創建好的頁面。
數據的框架可能看起來長成這樣:
{
"title": {...},
"tooltip": {...},
"toolbox": {...},
"axisPointer": {...},
"dataZoom": [{...}],
"legend": {...},
"xAxis": {...},
"yAxis": {...},
"series": [{...}],
"animation": false
}
最外側花括號中的鍵實際上是setOption函數支持的所有鍵。[4][5]下面僅根據上面的實例對這些鍵做具體介紹。
如果您只關注如何將每月的編輯數轉化為折線圖,那麼只要瞭解xAxis和series的一部分即可。其餘部分可參照官方文檔[5]或其他已經寫好的用戶處[6]查看。
xAxisxAxisxAxis即為x軸,您可以通過在其中添加data: []來指定x軸的數據。例如:"xAxis": {
"data": [
"2021年3月",
"2021年4月",
"2021年5月"
]
}
seriesseriesseries指定圖表系列,大致結構為:"series": [
{
...,
"data": [{"value": ..., "label": {...}}],
"markPoint": {
"data": [
{
"type": "max",
"name": "最大值"
},
{
"type": "min",
"name": "最小值"
}
]
},
"markLine": {
"data": [
{
"type": "average",
"name": "平均值"
}
]
}
}
]
data中指定:
value),您可以在這裡填入當月編輯數;label)是否顯示(show),"show": true則顯示、"show": false則不顯示;position),需要"show": true。"position": "bottom"則顯示在點的下方,"position": "top"則顯示在點的上方。markPoint用於標註特殊點,上面的代碼中標註出了最大值點和最小值點;markLine用於標註特殊線,上面的代碼中標註出了平均值線。xAxis的代碼,則可寫出:"series": [
{
...,
"data": [
{
"value": 572,
"label": {
"show": false
}
},
{
"value": 312,
"label": {
"show": true,
"position": "bottom"
}
},
{
"value": 290,
"label": {
"show": false
}
}
],
"markPoint": {
"data": [
{
"type": "max",
"name": "最大值"
},
{
"type": "min",
"name": "最小值"
}
]
},
"markLine": {
"data": [
{
"type": "average",
"name": "平均值"
}
]
}
}
]
markPoint中標出了最大值和最小值點,於是將最大值572和最小值290對應點設置"show": false。[7]此章節介紹示例中涉及到的所有鍵。[5]
titletitletitle為標題組件,包含主標題和副標題。例如:"title": {
"text": "我的編輯歷史",
"subtext": "按月統計次數",
"subtextStyle": {
"color": "#333"
}
}
text)為「我的編輯歷史」;subtext)為「按月統計次數」;subtextStyle)為對象,其中有一個鍵值對:文本顏色為#333。tooltiptooltiptooltip為提示框組件。例如:"tooltip": {
"trigger": "axis",
"axisPointer": {
"type": "cross",
"animation": false
}
}
trigger)為坐標軸觸發(axis),主要在柱狀圖、折線圖等會使用類目軸的圖表中使用;axisPointer)對象,其中有兩個鍵值對:指示器類型為十字準星指示器、不開啟動畫。toolboxtoolboxtoolbox為工具欄。例如:"toolbox": {
"show": true,
"feature": {
"dataZoom": {
"yAxisIndex": "none"
},
"dataView": {
"readOnly": true
},
"magicType": {
"type": ["line", "bar"]
},
"restore": {},
"saveAsImage": {
"excludeComponents": ["toolbox", "dataZoom"]
}
}
}
show);feature)對象,其中有五個鍵值對:
dataZoom)對象,其中有一個鍵值對:y軸索引為空,即不控制任何y軸;dataView)對象,其中有一個鍵值對:只讀,即不可編輯;magicType)對象,其中有一個鍵值對:啟用的動態類型為折線圖和柱狀圖;restore)為空;saveAsImage)對象,其中有一個鍵值對:忽略的組件列表為工具欄(toolbox)和數據區域縮放組件(dataZoom)。axisPointeraxisPointeraxisPointer為坐標軸指示器。例如:"axisPointer": {
"link": {
"xAxisIndex": "all"
}
}
link)對象,其中有一個鍵值對:所有的x軸進行聯動。dataZoomdataZoomdataZoom為數據區域縮放組件。例如:"dataZoom": [
{
"type": "inside",
"xAxisIndex": [0],
"startValue": 0,
"end": 100
},
{
"show": true,
"xAxisIndex": [0],
"type": "slider",
"start": 0,
"end": 100
}
]
type)為內置型(inside),即可以通過滑鼠拖拽和滾輪滾動來縮放坐標系;xAxisIndex)為第一個x軸;startValue)為0;end)為100%。type)為滑動條型(slider),即展示數據縮略圖;show);xAxisIndex)為第一個x軸;start)為0%;end)為100%。legendlegendlegend為圖例組件。例如:"legend": {
"data": [
"編輯次數"
]
}
data)為一個字符串「編輯次數」。其與series中的圖表名稱(name)對應。xAxisxAxisxAxis為直角坐標系的x軸。例如:"xAxis": {
"data": [
"2021年3月",
"2021年4月",
"2021年5月"
]
}
data)為三個字符串。yAxisyAxisyAxis為直角坐標系的y軸。seriesseriesseries指定圖表系列。例如:"series": [
{
"name": "編輯次數",
"type": "line",
"label": {
"formatter": "{c}",
"distance": 0,
"backgroundColor": "transparent",
"padding": 1
},
"data": [
{
"value": 572,
"label": {
"show": false
}
},
{
"value": 312,
"label": {
"show": true,
"position": "bottom"
}
},
{
"value": 290,
"label": {
"show": false
}
}
],
"markPoint": {
"data": [
{
"type": "max",
"name": "最大值"
},
{
"type": "min",
"name": "最小值"
}
]
},
"markLine": {
"data": [
{
"type": "average",
"name": "平均值"
}
]
}
}
]
type)為折線圖(line);name)為「每月編輯數」,在提示框(tooltip)中顯示。其與legend中的數據數組(data)對應;label)對象,其中有四個鍵值對:標籤內容格式為數據值、與圖形元素的距離為0、文字塊背景色為透明、文字塊的內邊距為1;data)中包含三個對象,指定了單個數據項的數值(value),標籤(label)是否顯示(show)以及位置(position);markPoint)對象,包含一個數據數組(data),指定了標註出最大值點和最小值點;markLine)對象,包含一個數據數組(data),指定了標註出平均值線。animationanimationanimation指定是否開啟動畫。xAxis的type為"category",此時data中只需以列表形式(如[2, 3, 5, 7, 11, 13])提供對應數據即可。修改方式可參考此條差異。[8]toolbox及其下屬內容全部刪除即可。此外,若希望調整工具欄中的功能,可參考官方文檔。[9]將編寫完成的頁面保存後需要將該頁面的類型更改為JSON,電腦版視圖下的具體操作步驟為:
至此,該頁面的內容類型就變成了JSON,可以通過{{Echart}}調用了。
{{Echart}}模板的使用參見模板文檔,在此不再贅述。
頁面開頭的圖表即使用{{Echart|datapage=User:GuoPC/ECExample1|height=300}}進行渲染。
作為「每月編輯歷史折線圖」,需要至少每月更新一次[來源請求],如何在已有數據頁面的基礎上增添數據呢?需要修改的還是xAxis和series兩部分。假定2021年6月的編輯數為400。
xAxisxAxis"xAxis": {
"data": [
"2021年3月",
"2021年4月",
"2021年5月"
]
}
,)"xAxis": {
"data": [
"2021年3月",
"2021年4月",
"2021年5月",
"2021年6月"
]
}
seriesseries"series": [
{
...,
"data": [
{
"value": 572,
"label": {
"show": false
}
},
{
"value": 312,
"label": {
"show": true,
"position": "bottom"
}
},
{
"value": 290,
"label": {
"show": false
}
}
],
"markPoint": {
"data": [
{
"type": "max",
"name": "最大值"
},
{
"type": "min",
"name": "最小值"
}
]
},
"markLine": {
"data": [
{
"type": "average",
"name": "平均值"
}
]
}
}
]
,)"series": [
{
...,
"data": [
{
"value": 572,
"label": {
"show": false
}
},
{
"value": 312,
"label": {
"show": true,
"position": "bottom"
}
},
{
"value": 290,
"label": {
"show": false
}
},
{
"value": 400,
"label": {
"show": true,
"position": "bottom"
}
}
],
"markPoint": {
"data": [
{
"type": "max",
"name": "最大值"
},
{
"type": "min",
"name": "最小值"
}
]
},
"markLine": {
"data": [
{
"type": "average",
"name": "平均值"
}
]
}
}
]
更新之後的圖表如下:
"title": {
"text": "我的編輯歷史",
"subtext": "按月統計次數",
"subtextStyle": {
"color": "#333"
}
},
"tooltip": {
"trigger": "axis",
"axisPointer": {
"type": "cross",
"animation": false
}
},
"toolbox": {
"show": true,
"feature": {
"dataZoom": {
"yAxisIndex": "none"
},
"dataView": {
"readOnly": true
},
"magicType": {
"type": [
"line",
"bar"
]
},
"restore": {},
"saveAsImage": {
"excludeComponents": [
"toolbox",
"dataZoom"
]
}
}
},
"axisPointer": {
"link": {
"xAxisIndex": "all"
}
},
"dataZoom": [
{
"type": "inside",
"xAxisIndex": [
0
],
"startValue": 0,
"end": 100
},
{
"show": true,
"xAxisIndex": [
0
],
"type": "slider",
"start": 0,
"end": 100
}
],
"legend": {
"data": [
"編輯次數"
]
},
"xAxis": {
"data": [
"2021年3月",
"2021年4月",
"2021年5月",
"2021年6月"
]
},
"yAxis": {},
"series": [
{
"name": "編輯次數",
"type": "line",
"label": {
"formatter": "{c}",
"distance": 0,
"backgroundColor": "transparent",
"padding": 1
},
"data": [
{
"value": 572,
"label": {
"show": false
}
},
{
"value": 312,
"label": {
"show": true,
"position": "bottom"
}
},
{
"value": 290,
"label": {
"show": false
}
},
{
"value": 400,
"label": {
"show": true
}
}
],
"markPoint": {
"data": [
{
"type": "max",
"name": "最大值"
},
{
"type": "min",
"name": "最小值"
}
],
"silent": true
},
"markLine": {
"data": [
{
"type": "average",
"name": "平均值"
}
],
"silent": true
}
}
],
"animation": false
}根據實際編輯數的不同,如果更新數據後最大或最小值有變,只要對label中show和position的值進行修改即可。
key: value的形式稱為鍵值對,其中key為鍵、value為值,鍵值對之間用,隔開。更多JSON相關內容在此不再贅述
setOption函數支持的所有鍵參見配置項 - Documentation - Apache ECharts