您现在的位置是:网站首页 > 柱状图(Bar Chart)实现文章详情
柱状图(Bar Chart)实现
陈川
【
ECharts
】
36816人已围观
5402字
柱状图(Bar Chart)实现
柱状图是一种常见的数据可视化形式,通过矩形条的高度或长度来展示不同类别的数值大小。ECharts提供了丰富的配置项来实现各种类型的柱状图,包括基础柱状图、堆叠柱状图、分组柱状图等。
基础柱状图实现
最简单的柱状图只需要x轴和y轴的数据即可。以下是一个基础柱状图的配置示例:
option = {
xAxis: {
type: 'category',
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
},
yAxis: {
type: 'value'
},
series: [{
data: [120, 200, 150, 80, 70, 110, 130],
type: 'bar'
}]
};
这段代码会生成一个包含7个柱子的柱状图,每个柱子对应一周中的一天。xAxis
配置了类目轴,yAxis
配置了数值轴,series
中的type: 'bar'
指定了图表类型为柱状图。
柱状图样式定制
ECharts允许对柱状图的各个方面进行样式定制:
series: [{
data: [120, 200, 150, 80, 70, 110, 130],
type: 'bar',
itemStyle: {
color: '#c23531',
shadowBlur: 10,
shadowColor: 'rgba(0, 0, 0, 0.5)'
},
barWidth: '40%',
barGap: '30%'
}]
这里我们设置了柱子的颜色、阴影效果、宽度和间距。barWidth
可以设置为像素值或百分比,barGap
控制同一系列的柱间距离。
多系列柱状图
当需要比较多个数据系列时,可以使用多系列柱状图:
option = {
xAxis: {
type: 'category',
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
},
yAxis: {
type: 'value'
},
series: [
{
name: 'Email',
type: 'bar',
data: [120, 132, 101, 134, 90, 230, 210]
},
{
name: 'Union Ads',
type: 'bar',
data: [220, 182, 191, 234, 290, 330, 310]
}
]
};
这个例子展示了两个数据系列的比较,每个类目下会有两个柱子并列显示。
堆叠柱状图
堆叠柱状图可以将多个系列的数据堆叠在一起显示总量:
series: [
{
name: 'Search Engine',
type: 'bar',
stack: 'total',
data: [120, 132, 101, 134, 90, 230, 210]
},
{
name: 'Direct',
type: 'bar',
stack: 'total',
data: [220, 182, 191, 234, 290, 330, 310]
}
]
关键配置是stack: 'total'
,这会将两个系列的数据堆叠在一起显示。
横向柱状图
通过交换x轴和y轴的配置,可以轻松实现横向柱状图:
option = {
yAxis: {
type: 'category',
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
},
xAxis: {
type: 'value'
},
series: [{
data: [120, 200, 150, 80, 70, 110, 130],
type: 'bar'
}]
};
动态排序柱状图
ECharts支持动态排序效果,可以创建更有表现力的柱状图:
function update() {
const data = option.series[0].data;
// 随机更新数据
for (let i = 0; i < data.length; ++i) {
data[i] = Math.round(Math.random() * 1000);
}
// 排序数据
option.series[0].data.sort(function (a, b) {
return a - b;
});
myChart.setOption(option);
}
setInterval(update, 3000);
这段代码每3秒会随机更新数据并重新排序柱子。
柱状图动画
ECharts内置了多种动画效果,可以通过配置项控制:
series: [{
type: 'bar',
data: [120, 200, 150, 80, 70, 110, 130],
animationDuration: 2000,
animationEasing: 'elasticOut',
animationDelay: function (idx) {
return idx * 100;
}
}]
animationDuration
控制动画时长,animationEasing
指定缓动函数,animationDelay
可以设置每个柱子的动画延迟时间。
柱状图标签显示
可以在柱子上显示数值标签:
series: [{
type: 'bar',
data: [120, 200, 150, 80, 70, 110, 130],
label: {
show: true,
position: 'top',
formatter: '{c}'
}
}]
label.position
可以设置为'top'、'inside'等位置,formatter
可以自定义标签内容。
响应式柱状图
为了使柱状图在不同屏幕尺寸下都能良好显示,可以监听窗口大小变化:
window.addEventListener('resize', function() {
myChart.resize();
});
// 或者在容器大小变化时
const resizeObserver = new ResizeObserver(() => {
myChart.resize();
});
resizeObserver.observe(document.getElementById('chart-container'));
柱状图交互
ECharts提供了丰富的交互功能,如数据区域缩放、图例开关等:
toolbox: {
feature: {
dataZoom: {
yAxisIndex: 'none'
},
restore: {},
saveAsImage: {}
}
},
dataZoom: [
{
type: 'inside',
start: 0,
end: 100
},
{
start: 0,
end: 100
}
]
这段代码添加了数据区域缩放工具和保存图片功能。
柱状图与其它图表组合
柱状图可以与其他图表类型组合使用,例如与折线图组合:
series: [
{
name: '蒸发量',
type: 'bar',
data: [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6]
},
{
name: '降水量',
type: 'line',
data: [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6]
}
]
大数据量柱状图优化
当数据量很大时,可以采用以下优化策略:
series: [{
type: 'bar',
data: largeData,
large: true,
largeThreshold: 1000,
progressive: 200,
progressiveThreshold: 3000
}]
large
和largeThreshold
启用大数据优化模式,progressive
和progressiveThreshold
控制渐进式渲染的块大小和阈值。
自定义柱状图形状
可以自定义柱子的形状,例如使用圆角:
series: [{
type: 'bar',
data: [120, 200, 150, 80, 70, 110, 130],
itemStyle: {
borderRadius: [5, 5, 0, 0]
}
}]
borderRadius
数组分别控制左上、右上、右下、左下的圆角半径。
柱状图事件处理
可以为柱状图添加交互事件:
myChart.on('click', function(params) {
console.log('点击了柱子', params.name, params.value);
});
myChart.on('mouseover', function(params) {
console.log('鼠标悬停在柱子上', params.name);
});
柱状图与地图结合
柱状图可以与地图结合使用,创建地理相关的数据可视化:
series: [{
type: 'map',
map: 'china',
// ...地图配置
}, {
type: 'bar',
coordinateSystem: 'geo',
data: [
{name: '北京', value: [116.46, 39.92, 100]},
{name: '上海', value: [121.48, 31.22, 80]}
],
// ...柱状图配置
}]
3D柱状图实现
使用ECharts GL可以创建3D柱状图:
option = {
grid3D: {},
xAxis3D: {
type: 'category',
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
},
yAxis3D: {
type: 'value'
},
zAxis3D: {},
series: [{
type: 'bar3D',
data: [
[0, 0, 120],
[1, 0, 200],
// ...其他数据
],
shading: 'lambert'
}]
};
柱状图性能优化
对于复杂柱状图,可以采取以下性能优化措施:
- 减少不必要的动画
- 使用
silent: true
禁用交互时的高亮效果 - 对于静态图表,设置
animation: false
关闭动画 - 使用
renderer: 'canvas'
而非SVG渲染器处理大数据
option = {
animation: false,
series: [{
type: 'bar',
silent: true,
// ...其他配置
}]
};
上一篇: 折线图(Line Chart)实现
下一篇: 饼图(Pie Chart)实现