echart立体柱状图

js 复制代码
const offsetX = 18;
const offsetY = 10;
[0, 0].forEach((customOffset, index) => {
  const CubeLeft = echarts.graphic.extendShape({
    shape: {
      x: 0,
      y: 0
    },
    buildPath: function (ctx, shape) {
      const xAxisPoint = shape.xAxisPoint;
      const c0 = [shape.x, shape.y];
      const c1 = [shape.x - offsetX, shape.y - offsetY];
      const c2 = [xAxisPoint[0] - offsetX, xAxisPoint[1] - offsetY];
      const c3 = [xAxisPoint[0], xAxisPoint[1]];
      ctx
        .moveTo(c0[0], c0[1])
        .lineTo(c1[0], c1[1])
        .lineTo(c2[0], c2[1])
        .lineTo(c3[0], c3[1])
        .closePath();
    }
  });
  const CubeRight = echarts.graphic.extendShape({
    shape: {
      x: 0,
      y: 0
    },
    buildPath: function (ctx, shape) {
      const xAxisPoint = shape.xAxisPoint;
      const c1 = [shape.x, shape.y];
      const c2 = [xAxisPoint[0], xAxisPoint[1]];
      const c3 = [xAxisPoint[0] + offsetX, xAxisPoint[1] - offsetY];
      const c4 = [shape.x + offsetX, shape.y - offsetY];
      ctx
        .moveTo(c1[0], c1[1])
        .lineTo(c2[0], c2[1])
        .lineTo(c3[0], c3[1])
        .lineTo(c4[0], c4[1])
        .closePath();
    }
  });
  const CubeTop = echarts.graphic.extendShape({
    shape: {
      x: 0,
      y: 0
    },
    buildPath: function (ctx, shape) {
      const c1 = [shape.x, shape.y];
      const c2 = [shape.x + offsetX, shape.y - offsetY];
      const c3 = [shape.x, shape.y - offsetX];
      const c4 = [shape.x - offsetX, shape.y - offsetY];
      ctx
        .moveTo(c1[0], c1[1])
        .lineTo(c2[0], c2[1])
        .lineTo(c3[0], c3[1])
        .lineTo(c4[0], c4[1])
        .closePath();
    }
  });
  echarts.graphic.registerShape('CubeLeft' + index, CubeLeft);
  echarts.graphic.registerShape('CubeRight' + index, CubeRight);
  echarts.graphic.registerShape('CubeTop' + index, CubeTop);
});
const value1 = [100, 220, 100, 160];
const value2 = [200, 180, 180, 210];
const value3 = [180, 230, 90, 90];
const value4 = [240, 190, 60, 253];
let max = 200;
value1.forEach((v, i) => {
  const sum = v + value2[i] + value3[i] + value4[i];
  max = sum > max ? sum : max;
});
max = Math.ceil(max / 200) * 200;

option = {
  backgroundColor: '#012366',
  tooltip: {
    trigger: 'axis',
    axisPointer: {
      type: 'shadow'
    }
  },
  grid: {
    left: 0,
    right: 0,
    bottom: 0,
    top: '10%',
    containLabel: true
  },
  legend: {
    type: 'scroll',
    orient: 'horizontal',
    top: 'top',
    itemWidth: 20, // 底部label的宽度
    itemHeight: 12, // 设置高度
    textStyle: {
      height: 12,
      color: '#FFFFFF'
    },
    data: [
      {
        name: '出国',
        icon: 'roundRect1',
        itemStyle: {
          color: '#FFE814'
        }
      },
      {
        name: '就业',
        icon: 'roundRect1',
        itemStyle: {
          color: '#FF8A00'
        }
      },
      {
        name: '考公',
        icon: 'roundRect1',
        itemStyle: {
          color: '#19C0C7'
        }
      },
      {
        name: '升学',
        icon: 'roundRect1',
        itemStyle: {
          color: '#3C88F6'
        }
      }
    ]
  },
  xAxis: {
    type: 'category',
    data: ['2024级', '2023级', '2022级', '2021级'],
    axisLine: {
      show: true,
      lineStyle: {
        width: 2,
        color: 'rgba(255, 255, 255, 0.3)'
      }
    },
    axisLabel: {
      color: '#FFFFFF',
      fontSize: 14
    }
  },
  yAxis: {
    type: 'value',
    min: 0,
    max: max,
    interval: 200,
    axisLine: {
      show: false
    },
    splitLine: {
      show: true,
      lineStyle: {
        color: 'rgba(255, 255, 255, 0.3)'
      }
    },
    axisTick: {
      show: false
    },
    axisLabel: {
      color: 'rgba(255, 255, 255, 0.7)'
    }
  },
  series: [
    {
      name: '出国',
      type: 'custom',
      itemStyle: {
        color: '#FFE814'
      },
      renderItem: function (params, api) {
        const index = params.dataIndex;
        const location = api.coord([
          api.value(0),
          api.value(1) + value1[index] + value2[index] + value3[index]
        ]);
        return {
          type: 'group',
          children: [
            {
              type: 'CubeLeft1',
              shape: {
                api,
                x: location[0],
                y: location[1],
                xAxisPoint: api.coord([
                  api.value(0),
                  value1[index] + value2[index] + value3[index]
                ])
              },
              style: {
                fill: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                  {
                    offset: 0,
                    color: 'rgba(255,205,6, 1)'
                  },
                  {
                    offset: 1,
                    color: 'rgba(255,205,6, .7)'
                  }
                ])
              }
            },
            {
              type: 'CubeRight1',
              shape: {
                api,
                x: location[0],
                y: location[1],
                xAxisPoint: api.coord([
                  api.value(0),
                  value1[index] + value2[index] + value3[index]
                ])
              },
              style: {
                fill: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                  {
                    offset: 0,
                    color: 'rgba(255,244,140, 1)'
                  },
                  {
                    offset: 1,
                    color: 'rgba(255,244,140, .8)'
                  }
                ])
              }
            },
            {
              type: 'CubeTop1',
              shape: {
                api,
                x: location[0],
                y: location[1],
                xAxisPoint: api.coord([api.value(0), 0])
              },
              style: {
                fill: `rgba(255,232,20, .9)`
              }
            }
          ]
        };
      },
      data: value4
    },
    {
      name: '就业',
      type: 'custom',
      itemStyle: {
        color: '#FF8A00'
      },
      renderItem: function (params, api) {
        const index = params.dataIndex;
        const location = api.coord([
          api.value(0),
          api.value(1) + value1[index] + value2[index]
        ]);
        return {
          type: 'group',
          children: [
            {
              type: 'CubeLeft1',
              shape: {
                api,
                x: location[0],
                y: location[1],
                xAxisPoint: api.coord([
                  api.value(0),
                  value1[index] + value2[index]
                ])
              },
              style: {
                fill: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                  {
                    offset: 0,
                    color: 'rgba(255,138,0, 1)'
                  },
                  {
                    offset: 1,
                    color: 'rgba(255,138,0, .5)'
                  }
                ])
              }
            },
            {
              type: 'CubeRight1',
              shape: {
                api,
                x: location[0],
                y: location[1],
                xAxisPoint: api.coord([
                  api.value(0),
                  value1[index] + value2[index]
                ])
              },
              style: {
                fill: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                  {
                    offset: 0,
                    color: 'rgba(255,165,61, 1)'
                  },
                  {
                    offset: 1,
                    color: 'rgba(255,165,61, .6)'
                  }
                ])
              }
            },
            {
              type: 'CubeTop1',
              shape: {
                api,
                x: location[0],
                y: location[1],
                xAxisPoint: api.coord([api.value(0), 0])
              },
              style: {
                fill: `rgba(255,138,0, .9)`
              }
            }
          ]
        };
      },
      data: value3
    },
    {
      name: '考公',
      type: 'custom',
      itemStyle: {
        color: '#19C0C7'
      },
      renderItem: function (params, api) {
        const index = params.dataIndex;
        const location = api.coord([
          api.value(0),
          api.value(1) + value1[index]
        ]);
        return {
          type: 'group',
          children: [
            {
              type: 'CubeLeft1',
              shape: {
                api,
                x: location[0],
                y: location[1],
                xAxisPoint: api.coord([api.value(0), value1[index]])
              },
              style: {
                fill: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                  {
                    offset: 0,
                    color: 'rgba(25,192,199, 1)'
                  },
                  {
                    offset: 1,
                    color: 'rgba(25,192,199, .5)'
                  }
                ])
              }
            },
            {
              type: 'CubeRight1',
              shape: {
                api,
                x: location[0],
                y: location[1],
                xAxisPoint: api.coord([api.value(0), value1[index]])
              },
              style: {
                fill: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                  {
                    offset: 0,
                    color: 'rgba(142,211,242, 1)'
                  },
                  {
                    offset: 1,
                    color: 'rgba(142,211,242, .6)'
                  }
                ])
              }
            },
            {
              type: 'CubeTop1',
              shape: {
                api,
                x: location[0],
                y: location[1],
                xAxisPoint: api.coord([api.value(0), 0])
              },
              style: {
                fill: `rgba(142,211,242, .9)`
              }
            }
          ]
        };
      },
      data: value2
    },
    {
      name: '升学',
      type: 'custom',
      itemStyle: {
        color: '#3C88F6'
      },
      renderItem: (params, api) => {
        const location = api.coord([api.value(0), api.value(1)]);
        return {
          type: 'group',
          children: [
            {
              type: 'CubeLeft1',
              shape: {
                api,
                xValue: api.value(0),
                yValue: api.value(1),
                x: location[0],
                y: location[1],
                xAxisPoint: api.coord([api.value(0), 0])
              },
              style: {
                fill: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                  {
                    offset: 0,
                    color: 'rgba(60,136,246, 1)'
                  },
                  {
                    offset: 1,
                    color: 'rgba(60,136,246, .5)'
                  }
                ])
              }
            },
            {
              type: 'CubeRight1',
              shape: {
                api,
                xValue: api.value(0),
                yValue: api.value(1),
                x: location[0],
                y: location[1],
                xAxisPoint: api.coord([api.value(0), 0])
              },
              style: {
                fill: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                  {
                    offset: 0,
                    color: 'rgba(121,178,241, 1)'
                  },
                  {
                    offset: 1,
                    color: 'rgba(121,178,241, .6)'
                  }
                ])
              }
            },
            {
              type: 'CubeTop1',
              shape: {
                api,
                xValue: api.value(0),
                yValue: api.value(1),
                x: location[0],
                y: location[1],
                xAxisPoint: api.coord([api.value(0), 0])
              },
              style: {
                fill: `rgba(121,178,241, .9)`
              }
            }
          ]
        };
      },
      data: value1
    }
  ]
};

还有一种圆柱体
https://www.jb51.net/javascript/305743l8e.htm

相关推荐
只愿云淡风清23 分钟前
ECharts地图数据压缩-ZigZag算法
前端·javascript·echarts
_菜鸟果果4 天前
Vue3+echarts 3d饼图
前端·javascript·echarts
java水泥工4 天前
基于Echarts+HTML5可视化数据大屏展示-电信厅店营业效能分析
前端·echarts·html5·大屏展示
paopaokaka_luck4 天前
基于SpringBoot+Vue的数码交流管理系统(AI问答、协同过滤算法、websocket实时聊天、Echarts图形化分析)
vue.js·人工智能·spring boot·websocket·echarts
麦麦大数据4 天前
F024 RNN+Vue+Flask电影推荐可视化系统 python flask mysql 深度学习 echarts
python·rnn·深度学习·vue·echarts·电影推荐
xiaohe06016 天前
🎉 Uni ECharts 2.0 正式发布:原来在 uni-app 中使用 ECharts 可以如此简单!
uni-app·echarts
码界筑梦坊7 天前
267-基于Django的携程酒店数据分析推荐系统
python·数据分析·django·毕业设计·echarts
HashTang8 天前
2025年10月实时最新获取地图边界数据方法,省市区县街道多级联动【文末附实时geoJson数据下载】
信息可视化·echarts·geojson·乡镇geojson·街道边界·geomap·街道geo
啦工作呢9 天前
数据可视化 ECharts
前端·信息可视化·echarts
U.2 SSD11 天前
Echart仪表盘示例
javascript·echarts