echart自定义图分享之自定百分比的(箱线图/盒须图)

本文分享如何使用Echarts创建了一个特殊的箱线图,支持非固定百分比分位(如10%、90%),并显示每个分位的具体值,通过自定义系列和轴配置实现独特视觉效果。

echarts自定义图之自定百分比的(箱线图/盒须图):

分享一些自己在工作中遇到的非常规图


`
创作原因:因客户需要指定样式的箱线图图(七分位,存在非固定分位:10%,90%,并且能查看每个分位的具体值)。在查看echarts自带的盒须图后,发现无法支持,便自己写了个。
自定义箱线图
以下为对应的echarts配置:

option = {
  tooltip: {
    trigger: 'item',
    axisPointer: {
      type: 'shadow'
    },
    formatter:(params)=>{
      if(params.seriesName!=='Placeholder')
      return params.seriesName+':'+params.data['sum'];
    }
  },
  grid: {
    left: '3%',
    right: '4%',
    bottom: '3%',
    top:'10',
    containLabel: true
  },
  xAxis: [{
    type: 'category',
    splitLine: { show: false },
    data: ['Total', 'Rent', 'Utilities', 'Transportation', 'Meals', 'Other']
  },
  {
    type: 'category',
    splitLine: { show: false },
    show:false,
  },
   {
    type: 'category',
    splitLine: { show: false },
    show:false,
  },
   {
    type: 'category',
    splitLine: { show: false },
    show:false,
  },
   {
    type: 'category',
    splitLine: { show: false },
    show:false,
  },
   {
    type: 'category',
    splitLine: { show: false },
    show:false,
  },
   {
    type: 'category',
    splitLine: { show: false },
    show:false,
  }],
  yAxis: {
    type: 'value'
  },
  series: [
    {
      name: 'Placeholder',
      type: 'bar',
      stack: 'Total',
      itemStyle: {
        borderColor: 'transparent',
        color: 'transparent'
      },
      emphasis: {
        itemStyle: {
          borderColor: 'transparent',
          color: 'transparent'
        }
      },
      data: [800, 1700, 1400, 1200, 300, 2000]
    },
    {
      xAxisIndex:1,
      name: 'min',
      type: 'bar',
      stack: 'Total',
      barWidth:1,
        itemStyle: {
        borderColor: '#333',
        color: 'rgb(96,133,167)',
        barWidth:0
      },
      label: {
        show: false,
        position: 'inside'
      },
      data: [{value:1100,sum:1900}, {value:1200,sum:1900}, {value:500,sum:1900}, {value:300,sum:1900}, {value:600,sum:1900}, {value:400,sum:1900}]
    },
    {
        xAxisIndex:2,
      name: '10%',
      type: 'bar',
      stack: 'Total',
      label: {
        show: false,
        position: 'inside',
        formatter:(params)=>{
          console.log('params',params.data[sum])
          return params.data[sum]
        }
      },
      barWidth:30,
       itemStyle: {
       borderColor: '#333',
        color: 'rgb(96,133,167)',
        borderWidth: 0.5,
      },
      data: [{value:500,sum:2400}, {value:500,sum:2400}, {value:500,sum:2400}, {value:500,sum:2400}, {value:500,sum:2400}, {value:500,sum:2400}]
    },
    {
        xAxisIndex:3,
      name: '25%',
      type: 'bar',
      stack: 'Total',
      label: {
        show: false,
        position: 'inside'
      },
      barWidth:50,
       itemStyle: {
        borderColor: '#000',
        color:'rgb(96,133,167)',
        borderWidth: 0.5,
      },
      data: [{value:500,sum:2400}, {value:500,sum:2400}, {value:500,sum:2400}, {value:500,sum:2400}, {value:500,sum:2400}, {value:500,sum:2400}]
   },
    {
        xAxisIndex:3,
      name: '50%',
      type: 'bar',
      stack: 'Total',
      label: {
        show: false,
        position: 'inside'
      },
      barWidth:50,
       itemStyle: {
        borderColor: '#000',
        color:'#000',
        borderWidth: 0.5,
      },
    data: [{value:30,sum:2400}, {value:30,sum:2400}, {value:30,sum:2400}, {value:30,sum:2400}, {value:30,sum:2400}, {value:30,sum:2400}]
    },
    {
        xAxisIndex:3,
      name: '75%',
      type: 'bar',
      stack: 'Total',
      label: {
        show: false,
        position: 'inside'
      },
      barWidth:50,
       itemStyle: {
        borderColor: '#000',
        color:'rgb(96,133,167)',
        borderWidth: 0.5,
      },
     data: [{value:200,sum:2400}, {value:400,sum:2400}, {value:800,sum:2400}, {value:500,sum:2400}, {value:500,sum:2400}, {value:500,sum:2400}]
   },
    {
        xAxisIndex:4,
      name: '90%',
      type: 'bar',
      stack: 'Total',
      label: {
        show: false,
        position: 'inside'
      },
      barWidth:30,
       itemStyle: {
       borderColor: '#000',
         color: 'rgb(96,133,167)',
        borderWidth: 0.5,
      },
       data: [{value:200,sum:2400}, {value:400,sum:2400}, {value:800,sum:2400}, {value:500,sum:2400}, {value:500,sum:2400}, {value:500,sum:2400}]
   },
    {
        xAxisIndex:5,
      name: 'max',
      type: 'bar',
      stack: 'Total',
      label: {
        show: false,
        position: 'inside'
      },
      barWidth:1,
       itemStyle: {
       borderColor: '#000',
         color: 'rgb(96,133,167)',
         borderWidth:2
      },
      data: [{value:200,sum:2400}, {value:400,sum:2400}, {value:800,sum:2400}, {value:500,sum:2400}, {value:500,sum:2400}, {value:500,sum:2400}]
    }
  ]
};
	}

没错,如果各位眼熟的话,这就是柱状图模拟而成的,不同分位用不同的serive数据组,不同宽度的分位用不同的x轴配置。
至于serive的data,采取了对象租,value的为显示的大小,而sum为显示时提供的各分位的值(计算累加即可),这里记得将tooltip的 trigger改为‘item’。
在这里插入图片描述

需求搞定~

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值