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

相关推荐
xChive1 天前
ECharts3D图表 | 3D柱状图和3D饼图实现思路
前端·3d·echarts
z止于至善1 天前
Vue ECharts:Vue 生态下的 ECharts 可视化最佳实践
前端·vue.js·echarts·vue echarts
xChive2 天前
ECharts-大屏开发复习记录与踩坑总结
前端·javascript·echarts
小黑的铁粉3 天前
ecahrts图形多的页面,怎么解决数据量大的渲染问题?
前端·echarts
还是大剑师兰特3 天前
vue3+vite+JS,使用Echarts封装一个饼图,父子组件联动
javascript·vue.js·echarts
qq_437100663 天前
echarts图表相关 电量进度图
前端·flask·echarts
源码之屋3 天前
毕业设计源码:python网易云音乐数据分析可视化平台 Flask+ECharts 多维度数据可视化分析 人工智能 大数据 机器学习 (建议收藏)✅
人工智能·python·信息可视化·django·毕业设计·echarts·课程设计
无心水3 天前
【OpenClaw:实战部署】9、一图胜千言:OpenClaw + ECharts 自动抓取多平台数据,每日可视化报表直达手机
信息可视化·智能手机·echarts
my小新4 天前
微信小程序引用echarts做统计图
微信小程序·小程序·echarts
这个实现不了11 天前
echarts实例:可堆叠的立体柱形图+特殊symbol的折线图
echarts