echarts-stat直方图分布,XY轴没有与主图对应的问题

文章讲述了在使用echarts-stat库创建直方图时,遇到XY轴与散点图不对应的问题。作者通过分析官方示例和自定义renderItem方法,调整了X轴和Y轴的min、max和interval,确保它们与散点图一致。文章提供了具体的JavaScript代码示例,展示了如何计算X和Y轴的分布以及自定义RECT的算法,以实现数据密集情况下的正确对应。

echarts-stat直方图分布,XY轴没有与主图对应的问题

https://echarts.apache.org/examples/en/editor.html?c=bar-histogram
官方示例
效果图:
在这里插入图片描述
散点图比较离散的情况下,效果很好

  1. 做一些假数据,数据比较密集,集中的情况下,XY轴与散点图不对应
    在这里插入图片描述
  2. 根据官方给的自定义renderItem进行方案修改
    https://blog.51cto.com/u_15294184/3052567

注意点:

  1. 分布图的X,Y轴的type均为value
  2. XY轴需要与散点图的XY轴min,max,interval相同
  3. 难点:Y轴分布图自定义RECT的算法
    具体代码:
    getOptions() {
      let data = Array.from(DataArray, item => [
        Number(item[0]),
        Number(item[1]),
      ])
      let xDatas = []
      let yDatas = []
      data.forEach(i => {
        xDatas.push(i[0])
        yDatas.push(i[1])
      })
      // X轴分布
      let xbins = histogram(xDatas)
      let Xinterval
      var xmin = Infinity
      var xmax = -Infinity
      var xdataArr = echarts.util.map(xbins.data, function (item, index) {
        // 左刻度
        var x0 = xbins.bins[index].x0
        // 右刻度
        var x1 = xbins.bins[index].x1
        Xinterval = x1 - x0
        // 获得数据集中最值
        xmin = Math.min(xmin, x0)
        xmax = Math.max(xmax, x1)
        // item[0]代表刻度的中间值,item[1]代表出现的次数
        return [x0, x1, item[1], item[4]]
      })
      // y轴分布
      let ybins = histogram(yDatas)
      let Yinterval
      var ymin = Infinity
      var ymax = -Infinity
      var ydataArr = echarts.util.map(ybins.data, function (item, index) {
        // 左刻度
        var x0 = ybins.bins[index].x0
        // 右刻度
        var x1 = ybins.bins[index].x1
        Yinterval = x1 - x0
        // 获得数据集中最值
        ymin = Math.min(ymin, x0)
        ymax = Math.max(ymax, x1)
        // item[0]代表刻度的中间值,item[1]代表出现的次数
        return [x0, x1, item[1], item[4]]
      })
      this.chartData = {
        dataset: [
          {
            source: data // this.mockdata()
            //sourceHeader: true // 表明第一行(列)开始就直接是数据。
          }
        ],
        tooltip: {},
        title: {},
        grid: [
          {
            // 左下
            top: '30%',
            right: '30%',
            left: '13%',
            bottom: 50,
            show: true,
            backgroundColor: '#000',
            borderColor: '#aaa'
          },
          {
            // 左上
            bottom: '74%',
            right: '30%',
            top: 20,
            left: '13%',
            show: true,
            backgroundColor: '#000',
            borderColor: '#aaa'
          },
          {
            // 右下
            top: '30%',
            left: '74%',
            bottom: 50,
            right: 20,
            show: true,
            backgroundColor: '#000',
            borderColor: '#aaa'
          }
        ],
        xAxis: [
          {
            name: 'X轴倾角°',
            nameLocation: 'center',
            nameGap: 25,
            nameTextStyle: {
              color: '#fff',
              fontSize: 14
            },
            scale: true,
            gridIndex: 0,
            axisLabel: {
              show: true,
              color: '#fff'
            },
            splitLine: {
              lineStyle: {
                color: '#aaa'
              }
            },
            min: xmin,
            max: xmax,
            interval: Xinterval
          },
          {
            type: 'value',
            // scale: true,
            axisTick: { show: false },
            axisLabel: { show: false },
            axisLine: { show: false },
            gridIndex: 1,
            min: xmin,
            max: xmax,
            interval: Xinterval,
            splitLine: {
              lineStyle: {
                color: '#aaa'
              }
            }
          },
          {
            type: 'value',
            //  scale: true,
            gridIndex: 2,
            //position: 'top',
            axisLabel: {
              show: true,
              color: '#fff'
            },
            splitLine: {
              lineStyle: {
                color: '#aaa'
              }
            }
          }
        ],
        yAxis: [
          {
            name: 'Y轴倾角°',
            nameLocation: 'center',
            nameGap: 50,
            nameRotate: 90,
            nameTextStyle: {
              color: '#fff',
              fontSize: 14
            },
            gridIndex: 0,
            axisLabel: {
              show: true,
              color: '#fff'
            },
            splitLine: {
              lineStyle: {
                color: '#aaa'
              }
            },
            min: ymin,
            max: ymax,
            interval: Yinterval
          },
          {
            type: 'value',
            gridIndex: 1,
            axisLabel: {
              show: true,
              color: '#fff'
            },
            splitLine: {
              lineStyle: {
                color: '#aaa'
              }
            }
          },
          {
            type: 'value',
            // type: 'category',
            axisTick: { show: false },
            axisLabel: { show: false },
            axisLine: { show: false },
            gridIndex: 2,
            splitLine: {
              lineStyle: {
                color: '#aaa'
              }
            },
            min: ymin,
            max: ymax,
            interval: Yinterval
          }
        ],
        series: [
          {
            name: 'x、y倾角',
            type: 'scatter',
            xAxisIndex: 0,
            yAxisIndex: 0,
            encode: {
              x: 0,
              y: 1,
              tooltip: [0, 1, 2]
            },
            datasetIndex: 0,
            tooltip: {
              formatter(params) {
                return (
                  params.value[2] +
                  '</br>' +
                  params.marker +
                  'x: ' +
                  params.value[0] +
                  ' y: ' +
                  params.value[1]
                )
              }
            }
          },
          {
            name: 'x分布',
            type: 'custom',
            xAxisIndex: 1,
            yAxisIndex: 1,
            renderItem: function (params, api) {
              // 这个根据自己的需求适当调节
              var yValue = api.value(2)
              var start = api.coord([api.value(0), yValue])
              var size = api.size([api.value(1) - api.value(0), yValue])
              var style = api.style()
              return {
                // 矩形及配置
                type: 'rect',
                shape: {
                  x: start[0] + 1,
                  y: start[1],
                  width: size[0] - 2,
                  height: size[1]
                },
                style: style
              }
            },
            barWidth: '99.3%',
            label: {
              show: false,
              position: 'top'
            },
            encode: { x: [0, 1], y: 2, itemName: 3 },
            // datasetIndex: 1,
            data: xdataArr
          },
          {
            name: 'y分布',
            type: 'custom',
            xAxisIndex: 2,
            yAxisIndex: 2,
            barWidth: '99.3%',
            label: {
              show: false,
              position: 'right'
            },
            renderItem: function (params, api) {
              // 这个根据自己的需求适当调节
              var xValue = api.value(2)
              var start = api.coord([0, api.value(1)])
              var size = api.size([xValue, api.value(1) - api.value(0)])
              var style = api.style()
              return {
                // 矩形及配置
                type: 'rect',
                shape: {
                  x: start[0],
                  y: start[1],
                  width: size[0],
                  height: size[1]
                },
                style: style
              }
            },
            // encode: { x: 1, y: 0, itemName: 4 },
            encode: { y: [0, 1], x: 2, itemName: 3 },
            data: ydataArr
            // datasetIndex: 2
          }
        ]
      }
    }

自定义分布图(画柱子)
在这里插入图片描述
效果图:
在这里插入图片描述

ECharts是一个强大的数据可视化库,而ECharts-Stat是一个基于ECharts的统计表插件,它提供了一些高级统计分析表的功能。散点(Scatter Chart)在ECharts中用于展示两个变量之间的关系,每个点代表一对数值,通过颜色、大小等属性可以表示更多的信息。 指数回归线(Exponential Regression Line)通常用于描述非线性的增长趋势,ECharts-Stat可以帮助你在散点上绘制并显示指数函数拟合的结果,这对于理解复杂的数据模式很有帮助。 线性提示(Linear Trend Line)则适用于呈现数据的趋势,特别是在线性模型下。ECharts允许你在散点上添加一条线性预测线,并显示其方程。 R平方(R-squared),也称为决定系数,是用来衡量模型解释因变量变异的程度。ECharts-Stat可能会在散点中计算并显示这个值,它表示了模型解释的变异性占总变异性比例的百分比,越高说明模型拟合越好。 要在ECharts中创建这样的表,你需要先安装EChartsECharts-Stat,然后配置一个包含散点、回归线和R平方的选项,例如: ```javascript var chart = echarts.init(document.getElementById('main')); chart.setOption({ series: [{ type: 'scatter', data: ..., symbolSize: function (val) { return val[2] || 5; // 指定点的大小 } }], stats: { regression: { type: 'exponential', // 设置回归类型为指数 show: true, rSquared: true // 显示R平方值 } }, tooltip: { trigger: 'item', formatter: "{a} <br/>{b}: {c}% ({d})" // 自定义提示信息,包含R平方 } }); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值