在做資料可視化開發過程中,一般使用較多的就是圖表庫了, 完全免費,代碼開源,且上手快,文檔和示例都比較全面,接下來就分享一些
Echarts
Echarts
圖表庫的一些使用技巧和對常見問題進行彙總。
打開示例頁面,将代碼複制到左側的編輯框中可以預覽效果。
1、Y坐标文字過長被遮擋
解決辦法:設定配置項的
grid
為任意數值後,圖表會計算y軸寬度并自适應
left
grid: {
left: 0, // 與容器左側的距離
right: 0, // 與容器右側的距離
bottom: "3%",
top: "0",
containLabel: true // grid 區域是否包含坐标軸的刻度标簽
}
2、X軸标簽過長,展示不全
解決辦法:旋轉角度,傾斜展示或者省略号表示
xAxis: {
axisLabel: {
color: "#5e6877", // x軸字型顔色
interval: 0, // 0 強制顯示所有标簽,預設auto
rotate: 20 // 刻度标簽旋轉的角度
}
}
// 省略号表示
xAxis: {
axisLabel: {
formatter: function (value) {
if (value.length > 6) {
return value.substring(0, 6) + "...";
} else {
return value;
}
}
}
}
3、legend圖例内容過長,與圖表發生重疊
解決辦法:格式化換行
legend: {
type: 'scroll', // 可滾動翻頁的圖例,當圖例數量較多時可以使用
orient: 'vertical',
textStyle: {
lineHeight: 20
},
formatter: function(sStr) { // 需要配合textStyle.lineHeight設定行高,不然換行後行間距太小
var str = "";
var l = 0;
var schar;
for (var i = 0; schar = sStr.charAt(i); i++) {
str += schar;
// /[^\x00-\xff]/ 比對雙位元組字元,如中文、全角符号,其它單位元組字元如字母、數字、半角符号
l += schar.match(/[^\x00-\xff]/) ? 2 : 1;
if (l > 10) {
// 隻有原字元串内容長度大于需要換行的長度臨界點,才需要換行
str += (sStr.length > str.length) ? '\n' : '';
l = 0;
}
}
return str;
}
}
4、tooltip顯示内容較多時,超出螢幕,顯示不全
解決辦法:添加 confine
屬性
tooltip: {
confine: true // 是否将 tooltip 框限制在圖表區域内
}
5、折線圖整體資料值偏大,顯示範圍幅度不明顯
解決辦法:添加屬性,設定
scale
不是從 開始
Y軸
yAxis: {
type: 'value',
scale: true // 按比例顯示
}
6、移動端柱形圖内容較多,配置螢幕旋轉
解決辦法:在容器标簽上添加一個旋轉的 class
樣式(版本(4.8.0),顯示沒有問題)
.horizontalScreen {
transform: rotate(90deg);
transform-origin: bottom left;
position: absolute;
top: -100vw;
height: 100vw;
width: 100vh;
background-color:#FFF;
z-index: 100;
}
7、柱形圖預設寬度自适應,導緻多條資料與單條資料寬度顯示不一緻
解決辦法:增加 barMaxWidth
屬性,設定一個最大寬度值
series: [
{
type: 'bar',
barMaxWidth: 30 // 可以是絕對值例如 40 或者百分數例如 '60%',百分數基于自動計算出的每一類目的寬度。
}
]
8、圖表響應式縮放
解決辦法:監聽浏覽器視窗的 resize
方法,可以添加多個圖表
window.addEventListener('resize', () => {
myChart.resize();
// myChart2.resize();
// myChart3.resize();
})
9、圖表内容過多,一屏或者容器顯示不下
解決辦法:可以增加滑塊縮放滾動,加上 dataZoom
配置
dataZoom: [
{
show: true,
startValue: startOffset, // 資料視窗範圍的起始數值
endValue: endOffset // 資料視窗範圍的結束數值
},
{
type: 'inside'
}
]
10、legend設定單選
解決辦法:增加屬性,設定為
selectedMode
single
legend: {
data:[],
selectedMode: 'single',
}
11、實作折線圖局部虛線
解決辦法:中兩組資料
series
相同,
name
資料部分,實作或者虛線無值的部分用空來占位。
data
option = {
xAxis: {
type: 'category',
data: ['1日', '2日', '3日', '4日', '5日', '6日', '7日', '8日', '9日', '10日']
},
yAxis: {
type: 'value'
},
series: [{
name: '産量',
data: [820, 932, '', '', 930, 1200, 1000, 1110, '', ''],
type: 'line',
itemStyle: {
normal: {
lineStyle: {
width: 2
}
}
}
},
{
name: '産量',
data: ['', 932, 800, 900, 930, '', '', 1110, 1200, 900],
type: 'line',
itemStyle: {
normal: {
lineStyle: {
width: 2,
type: 'dashed'
}
}
}
}
]
};

12、柱狀圖實作重合并且以虛線展示
解決辦法:表示不同系列的柱間距離,預設為30%,通過設定
barGap
為
barGap
可以讓柱形圖實作重合。
-100%
option = {
xAxis: {
data: ['a', 'b', 'c', 'd'],
axisTick: { show: false }
},
yAxis: {
splitLine: { show: false }
},
animationDurationUpdate: 1200,
series: [{
type: 'bar',
itemStyle: {
normal: {
color: 'transparent',
barBorderColor: 'tomato',
barBorderWidth: 2,
barBorderRadius: 0,
borderType: "dotted"
}
},
silent: true,
barWidth: 40,
barGap: '-100%', // 柱子重疊
data: [60, 60, 60, 60]
}, {
type: 'bar',
barWidth: 40,
z: 10,
data: [45, 60, 13, 25]
}]
};
不設定
barGap
時是這樣的:
設定
barGap
為
-100%
後:
13、實作多Y軸展示
解決辦法:給對象設定多組數組,分别代表不同
yAxis
;在
Y軸
中配置時,每項需配置
series
,不設定改參數,預設為0。
yAxisIndex
// 通過多Y軸,來實作多個次元對比來看資料的變化
var colors = ['#5793f3', '#d14a61', '#675bba'];
option = {
color: colors,
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'cross'
}
},
legend: {
data: ['蒸發量', '降水量', '平均溫度']
},
xAxis: [
{
type: 'category',
axisTick: {
alignWithLabel: true
},
data: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
}
],
yAxis: [
{
type: 'value',
name: '蒸發量',
min: 0,
max: 250,
position: 'right',
axisLine: {
lineStyle: {
color: colors[0]
}
},
axisLabel: {
formatter: '{value} ml'
}
},
{
type: 'value',
name: '降水量',
min: 0,
max: 250,
position: 'right',
offset: 80,
axisLine: {
lineStyle: {
color: colors[1]
}
},
axisLabel: {
formatter: '{value} ml'
}
},
{
type: 'value',
name: '溫度',
min: 0,
max: 25,
position: 'left',
axisLine: {
lineStyle: {
color: colors[2]
}
},
axisLabel: {
formatter: '{value} °C'
}
}
],
series: [
{
name: '蒸發量',
type: 'bar',
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: '降水量',
type: 'bar',
yAxisIndex: 1,
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: '平均溫度',
type: 'line',
yAxisIndex: 2,
data: [2.0, 2.2, 3.3, 4.5, 6.3, 10.2, 20.3, 23.4, 23.0, 16.5, 12.0, 6.2]
}
]
};
14、圖表在舊容器上重新渲染不出來問題
解決辦法:首先,官方文檔也有說明,建立一個,傳回
ECharts執行個體
,不能在單個容器上初始化多個
echartsInstance
。
ECharts執行個體
每次執行個體化都會在容器标簽上産生一個唯一的
Echarts
,那可以重新渲染之前把容器标簽的
echartsInstance ID
屬性移除,重新
_echarts_instance_
後就會自動生成一個新的
echarts.init
,此後圖表就可以正常渲染了。
echartsInstance ID
var chartEle = document.getElementById('chartId');
chartEle.removeAttribute('_echarts_instance_'); // 移除容器标簽的 '_echarts_instance_' 執行個體屬性,使用echarts.init重新生成一個新的執行個體ID
var myChart = echarts.init(chartEle);
myChart.setOption(option);
15、圖表上添加點選跳轉
解決辦法: Echarts執行個體
上可以添加監聽滑鼠事件,滑鼠事件包括 ‘click’、‘dblclick’、‘mousedown’、‘mousemove’、‘mouseup’、‘mouseover’、‘mouseout’、‘globalout’、‘contextmenu’。
myChart.on('click', function(params) {
window.open(params.data.url);
});
16、圖表上添加水印
解決辦法: Echarts執行個體
上可以添加監聽滑鼠de 事件,滑鼠事件包括 ‘click’、‘dblclick’、‘mousedown’、‘mousemove’、‘mouseup’、‘mouseover’、‘mouseout’、‘globalout’、‘contextmenu’。
// 在前端設定樣式然後添加到背景中
var waterMarkText = 'ECHARTS'; //水印名稱
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d'); //水印畫布
canvas.width = canvas.height = 100; //水印高寬
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
ctx.globalAlpha = 0.2; //水印透明度
ctx.font = '20px Microsoft Yahei'; //水印字型
ctx.translate(50, 50); //水印完整性
ctx.rotate(-Math.PI / 4);
ctx.fillText(waterMarkText, 0, 0);//水印顯示情況
//在option中添加水印背景
option = {
xAxis: {
type: 'category',
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
},
yAxis: {
type: 'value'
},
backgroundColor: {
type: 'pattern',
image: canvas,
repeat: 'no-repeat'
},
series: [{
data: [150, 230, 224, 218, 135, 147, 260],
type: 'line'
}]
};
17、圖表上添加工具欄
内置有導出圖檔,資料視圖,動态類型切換,資料區域縮放,重置五個工具。
option = {
xAxis: {
type: 'category',
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
},
yAxis: {
type: 'value'
},
toolbox: {
show : true,
feature : {
mark : {show: true},
dataZoom : {show: true}, // 區域縮放
dataView : {show: true, readOnly: false}, // 資料預覽
magicType : {show: true, type: ['line', 'bar']}, // 切換類型
restore : {show: true}, // 重新整理
saveAsImage : {show: true} // 儲存
}
},
series: [{
data: [150, 230, 224, 218, 135, 147, 260],
type: 'line'
}]
};
會繼續更新中,敬請期待。