ECharts實現(xiàn)數(shù)據(jù)超出Y軸最大值max但不隱藏
需求
Y軸必須有最大值,我的折線圖的數(shù)據(jù)可能會超過這個最大值,但是!我需要讓他的刻度顯示在最大值的位置但是提示框顯示的是原來的值。
如下圖:
先翻翻文檔
yAxis
好家伙,不看不知道一看嚇一跳,光 Y 軸的 第一層配置就三十幾項。不過好在現(xiàn)在我們不需要關(guān)注其他的,找找與數(shù)值范圍限制的相關(guān)屬性吧:
- min:設(shè)置 y 軸刻度最小值,默認是 小于等于所有數(shù)據(jù)最小值 的值,具體根據(jù)刻度單位進行計算;手動設(shè)置后,小于該值的部分將 不予顯示
- max:設(shè)置 y 軸刻度最大值,默認是 大于等于所有數(shù)據(jù)最小值 的值,具體根據(jù)刻度單位進行計算;手動設(shè)置后,大于該值的部分將 不予顯示
- splitNumber:刻度數(shù)量,只能用于 value 數(shù)值類型的數(shù)據(jù)
- minInterval:自動計算的坐標軸最小間隔大小,只在數(shù)值軸或時間軸中('value' 或 'time')有效。
- maxInterval:自動計算的坐標軸最大間隔大小,只在數(shù)值軸或時間軸中('value' 或 'time')有效。
- interval:強制設(shè)置坐標軸分割間隔。
這里面的 splitNumber 與 interval 算是一個相對概念,一般設(shè)置一個或者都不設(shè)置就行了。
根據(jù)我們產(chǎn)品同學的需求,這里肯定是需要一個 max 配置的,但是設(shè)置以后超出 max 的數(shù)據(jù)部分就不能顯示了,找遍了 y 軸的配置都沒有對應(yīng)的解決方案,這咋辦呢
此時效果如下,超出部分直接顯示為被截斷
那既然 y 軸沒有,我們就試試可以不可以從 data 數(shù)據(jù)中下手,也就是series 配置,因為是折線圖部分,所以就直接看折線了。
series.Line
en... 仔細一看這也有好幾十個配置項,那就慢慢看吧。
在大致找了一圈之后,發(fā)現(xiàn)與數(shù)據(jù)顯示相關(guān)的屬性,大概有以下幾個:
data:當然這個就不用說了,沒有這個都沒有顯示的內(nèi)容。不過這里有一些值得注意的地方:
- 當某個數(shù)據(jù)是
-
、null
或者undefined
時,該處對應(yīng)的圖元素會消失,折線圖會斷開 - 當使用的是 value 或者 log 類數(shù)據(jù)時,可以使用字符串形式的數(shù)字(當然這個字符串必須可以被 Number 正常轉(zhuǎn)化)
- 當使用的是 value 或者 log 類數(shù)據(jù)時,不僅可以使用 number 和 string,也可以使用 對象元素,但其中必須有一個 value 屬性指定一個具體數(shù)值用來在圖表上顯示
yAxisIndex 與 xAxisIndex:用來指定對應(yīng)的坐標軸
- label:每項數(shù)據(jù)的數(shù)值在圖表上的顯示,對象形式的配置項,內(nèi)部包含一個 formatter 配置用來進行轉(zhuǎn)換
- emphasis:折線圖數(shù)據(jù) 高亮狀態(tài)(被選中狀態(tài)/鼠標 hover 狀態(tài)) 下的顯示配置,內(nèi)部也包含與外部相同 label、itemStyle 等配置
- tooltip:當前系列特定的 tooltip 的顯示配置,內(nèi)部包含 兩個數(shù)據(jù)處理配置:formatter 和 valueFormatter
看到這里其實可以發(fā)現(xiàn),與 顯示 相關(guān)的最重要的就是 formatter 和 valueFormatter。其中 valueFormatter 是一個以當前值為參數(shù)的回調(diào)函數(shù),返回一個字符串,而 formatter 則是一個 字符串模板 或者 函數(shù)形式,
關(guān)于 formatter 的具體說明可以看文檔 tooltip.formatter,函數(shù)說明實在是太多了,不太好總結(jié)。
解決方案
看完了文檔之后,就發(fā)現(xiàn)突然有了一個好主意。
把原本的 data 數(shù)組轉(zhuǎn)換成一個特殊對象數(shù)組,用 value 屬性來控制顯示不超過 y 軸 max 值,用另外一個屬性 realValue 來保存原始值,最后再用 tooltip 的 formatter 轉(zhuǎn)換一下不就行了?
說干就干,首先就處理一下原始的數(shù)值數(shù)組吧。
const reallyData = [2.0, 18.2, 3.3, 4.5, 16.3, 10.2, 20.3] const formatData = reallyData.map(realValue => ({value: realValue >= 15 ? 15 : realValue, realValue }))
然后再處理一下顯示的配置吧。
因為在series.line.tooltip 中配置的 formatter 僅適用于 tooltip.trigger 為 item 時有效,不滿足場景,所以只能在外面的 tooltip 中配置。兩者的配置項都是一樣的。
tooltip: { trigger: 'axis', axisPointer: { type: 'cross', crossStyle: { color: '#999' } }, formatter(params) { return params.reduce((res, item, index) => { if (index === 0) { res += `${item.axisValue} ` } if (item.seriesName === 'Temperature') { res += `${item.marker + item.seriesName + item.data.realValue} ℃ ` } else { res += `${item.marker + item.seriesName + item.data} ml ` } return res }, '') } }
因為有多個數(shù)據(jù),為了不影響其他數(shù)據(jù)的顯示,所以需要 判斷數(shù)據(jù)標識,也就是 series 中每個數(shù)據(jù)項配置的 name 字段,這里可以通過 seriesName 獲取。其中的 marker 是本身的 圖例顯示節(jié)點。
當匹配到我們需要處理的那一項數(shù)據(jù)時,可以通過手動設(shè)置我們需要的值來回顯,最后返回一個字符串或者一個 DOM 結(jié)構(gòu)即可。
完整代碼
var dom = document.getElementById('chart-container'); var myChart = echarts.init(dom, null, { renderer: 'canvas', useDirtyRect: false }); var app = {}; var option; const testData = [2.0, 18.2, 3.3, 4.5, 16.3, 10.2, 20.3].map(num => ({value: num >= 15 ? 15 : num, num })) option = { tooltip: { trigger: 'axis', axisPointer: { type: 'cross', crossStyle: { color: '#999' } }, formatter(params) { console.log(params); return params.reduce((res, item, index) => { if (index === 0) { res += `${item.axisValue} ` } if (item.seriesName === 'Temperature') { res += `${item.marker + item.seriesName + item.data.num} ℃ ` } else { res += `${item.marker + item.seriesName + item.data} ml ` } return res }, '') } }, legend: { data: ['Evaporation', 'Precipitation', 'Temperature'] }, xAxis: [ { type: 'category', data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], axisPointer: { type: 'shadow' } } ], yAxis: [ { type: 'value', name: 'Precipitation', min: 0, max: 250, interval: 50, axisLabel: { formatter: '{value} ml' } }, { type: 'value', name: 'Temperature', min: 0, max: 15, interval: 5, axisLabel: { formatter: '{value} °C' } } ], series: [ { name: 'Evaporation', type: 'bar', tooltip: { valueFormatter: function (value) { return value + ' ml'; } }, data: [ 2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3 ] }, { name: 'Precipitation', type: 'bar', tooltip: { valueFormatter: function (value) { return value + ' ml'; } }, data: [ 2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3 ] }, { name: 'Temperature', type: 'line', yAxisIndex: 1, data: testData } ] }; if (option && typeof option === 'object') { myChart.setOption(option); } console.log(testData); window.addEventListener('resize', myChart.resize);
以上就是ECharts實現(xiàn)數(shù)據(jù)超出Y軸最大值max但不隱藏的詳細內(nèi)容,更多關(guān)于ECharts數(shù)據(jù)超出Y軸最大值不隱藏的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JavaScript 雙向鏈表操作實例分析【創(chuàng)建、增加、查找、刪除等】
這篇文章主要介紹了JavaScript 雙向鏈表操作,結(jié)合實例形式分析了JavaScript雙向鏈表的創(chuàng)建、增加、查找、刪除等相關(guān)操作技巧,需要的朋友可以參考下2020-04-04JavaScript實現(xiàn)復(fù)制功能各瀏覽器支持情況實測
這兩天在做Web前端時,遇到需求通過js實現(xiàn)文本復(fù)制的功能,下面與大家分享下各瀏覽器對復(fù)制功能的支持情況,感興趣的朋友可以參考下哈2013-07-07Echarts通過dataset數(shù)據(jù)集實現(xiàn)創(chuàng)建單軸散點圖
這篇文章主要為大家詳細介紹了Echarts如何通過dataset數(shù)據(jù)集實現(xiàn)創(chuàng)建單軸散點圖,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2023-02-02