ECharts實現(xiàn)數(shù)據(jù)超出Y軸最大值max但不隱藏
需求
Y軸必須有最大值,我的折線圖的數(shù)據(jù)可能會超過這個最大值,但是!我需要讓他的刻度顯示在最大值的位置但是提示框顯示的是原來的值。
如下圖:

先翻翻文檔
yAxis
好家伙,不看不知道一看嚇一跳,光 Y 軸的 第一層配置就三十幾項。不過好在現(xiàn)在我們不需要關(guān)注其他的,找找與數(shù)值范圍限制的相關(guān)屬性吧:
- min:設置 y 軸刻度最小值,默認是 小于等于所有數(shù)據(jù)最小值 的值,具體根據(jù)刻度單位進行計算;手動設置后,小于該值的部分將 不予顯示
- max:設置 y 軸刻度最大值,默認是 大于等于所有數(shù)據(jù)最小值 的值,具體根據(jù)刻度單位進行計算;手動設置后,大于該值的部分將 不予顯示
- splitNumber:刻度數(shù)量,只能用于 value 數(shù)值類型的數(shù)據(jù)
- minInterval:自動計算的坐標軸最小間隔大小,只在數(shù)值軸或時間軸中('value' 或 'time')有效。
- maxInterval:自動計算的坐標軸最大間隔大小,只在數(shù)值軸或時間軸中('value' 或 'time')有效。
- interval:強制設置坐標軸分割間隔。
這里面的 splitNumber 與 interval 算是一個相對概念,一般設置一個或者都不設置就行了。
根據(jù)我們產(chǎn)品同學的需求,這里肯定是需要一個 max 配置的,但是設置以后超出 max 的數(shù)據(jù)部分就不能顯示了,找遍了 y 軸的配置都沒有對應的解決方案,這咋辦呢
此時效果如下,超出部分直接顯示為被截斷

那既然 y 軸沒有,我們就試試可以不可以從 data 數(shù)據(jù)中下手,也就是series 配置,因為是折線圖部分,所以就直接看折線了。
series.Line
en... 仔細一看這也有好幾十個配置項,那就慢慢看吧。
在大致找了一圈之后,發(fā)現(xiàn)與數(shù)據(jù)顯示相關(guān)的屬性,大概有以下幾個:
data:當然這個就不用說了,沒有這個都沒有顯示的內(nèi)容。不過這里有一些值得注意的地方:
- 當某個數(shù)據(jù)是
-、null或者undefined時,該處對應的圖元素會消失,折線圖會斷開 - 當使用的是 value 或者 log 類數(shù)據(jù)時,可以使用字符串形式的數(shù)字(當然這個字符串必須可以被 Number 正常轉(zhuǎn)化)
- 當使用的是 value 或者 log 類數(shù)據(jù)時,不僅可以使用 number 和 string,也可以使用 對象元素,但其中必須有一個 value 屬性指定一個具體數(shù)值用來在圖表上顯示
yAxisIndex 與 xAxisIndex:用來指定對應的坐標軸
- 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ù)時,可以通過手動設置我們需要的值來回顯,最后返回一個字符串或者一個 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)文章
js和jquery實現(xiàn)tab狀態(tài)欄切換效果
這篇文章主要為大家詳細介紹了js和jquery實現(xiàn)tab狀態(tài)欄切換效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08
js數(shù)組循環(huán)遍歷數(shù)組內(nèi)所有元素的方法
在js中數(shù)組遍歷最簡單的辦法就是使用for然后再利用arr.length長度作為for最大限度值即可解決了,下面我們來看看一些有用的實例2014-01-01

