Highcharts 实现3D饼图 tooltip轮播

在这里插入图片描述
实现3D饼图,并且轮播显示tooltip
自定义toottip样式

import Highcharts from 'highcharts';
import highcharts from 'highcharts';
import highcharts3d from 'highcharts/highcharts-3d';

highcharts3d(Highcharts);
highcharts3d(highcharts);
import { useEffect, useState } from 'react';

/**
 * 不同高度的3D圆环图
 * */
export function getPie(id) {
  let colorArr = ['#f04f45', '#66f2ff', '#7fa9ff', '#d26657', '#F4414A'];

  Highcharts.getOptions().colors = Highcharts.map(Highcharts.getOptions().colors, function(
    color,
    i
  ) {
    return {
      radialGradient: {
        cx: 0.5,
        cy: 0.3,
        r: 0.7,
      },
      stops: [
        [0, colorArr[i]],
        [
          1,
          Highcharts.Color(colorArr[i])
            .brighten(-0.2)
            .get('rgb'),
        ],
      ],
    };
  });
  var each = highcharts.each,
    round = Math.round,
    cos = Math.cos,
    sin = Math.sin,
    deg2rad = Math.deg2rad;
  highcharts.wrap(highcharts.seriesTypes.pie.prototype, 'translate', function(proceed) {
    proceed.apply(this, [].slice.call(arguments, 1));
    // Do not do this if the chart is not 3D
    if (!this.chart.is3d()) {
      return;
    }
    var series = this,
      chart = series.chart,
      options = chart.options,
      seriesOptions = series.options,
      depth = seriesOptions.depth || 0,
      options3d = options.chart.options3d,
      alpha = options3d.alpha,
      beta = options3d.beta,
      z = seriesOptions.stacking ? (seriesOptions.stack || 0) * depth : series._i * depth;
    z += depth / 2;
    if (seriesOptions.grouping !== false) {
      z = 0;
    }
    each(series.data, function(point) {
      var shapeArgs = point.shapeArgs,
        angle;
      point.shapeType = 'arc3d';
      var ran = point.options.h;
      shapeArgs.z = z;
      shapeArgs.depth = depth * 0.75 + ran;
      shapeArgs.alpha = alpha;
      shapeArgs.beta = beta;
      shapeArgs.center = series.center;
      shapeArgs.ran = ran;
      angle = (shapeArgs.end + shapeArgs.start) / 2;
      point.slicedTranslation = {
        translateX: round(cos(angle) * seriesOptions.slicedOffset * cos(alpha * deg2rad)),
        translateY: round(sin(angle) * seriesOptions.slicedOffset * cos(alpha * deg2rad)),
      };
    });
  });
  (function(H) {
    H.wrap(highcharts.SVGRenderer.prototype, 'arc3dPath', function(proceed) {
      // Run original proceed method
      var ret = proceed.apply(this, [].slice.call(arguments, 1));
      ret.zTop = (ret.zOut + 0.5) / 100;
      return ret;
    });
  })(highcharts);

  // 生成不同高度的3d饼图
  var chart = highcharts.chart(id, {
    chart: {
      type: 'pie',
      animation: false,
      backgroundColor: 'rgba(0, 0, 0, 0)', // 不显示背景色
      events: {
        load: function() {
          console.log('ecah  hight');
          var each = highcharts.each,
            points = this.series[0].points;
          each(points, function(p) {
            p.graphic.attr({
              translateY: -p.shapeArgs.ran,
            });
            p.graphic.side1.attr({
              translateY: -p.shapeArgs.ran,
            });
            p.graphic.side2.attr({
              translateY: -p.shapeArgs.ran,
            });
          });

          // 轮播显示提示框
          var chart = this;
          var points = chart.series[0].points;
          var len = points.length;
          var i = 0;
          var timer = null;
          timer && clearInterval(timer);
          timer = setInterval(function() {
            autoTooltip(points[i]);
            i++;
            if (i === len) {
              i = 0;
            }
          }, 3000);
        },
      },
      options3d: {
        enabled: true,
        alpha: 75,
        beta: 0,
      },
    },

    title: '',
    legend: {
      floating: true,
      align: 'center',
      verticalAlign: 'top',
      symbolHeight: 9,
      symbolWidth: 9,
      itemStyle: {
        fontWeight: 'normal',
      },
      useHTML: true,
      labelFormatter: function() {
        return (
          '<span style="color: #fff;margin-left: 10px; font-size:13px">' +
          this.name +
          '</span>' +
          '<span style="color: ' +
          colorArr[this.index] +
          ';">'
        );
      },
    },
    tooltip: {
      style: {
        //提示框内容样式
        color: '#ECF5FE',
        fontSize: '14px',
      },
      useHTML: true,
      backgroundColor: 'rgba(255, 255, 255, 0.8)',
      borderColor: 'rgba(0, 0, 0, 0)',
      borderRadius: 0,
      borderWidth: 0,
      shadow: false,
      formatter: function() {
        var point = this.point;
        return (
          '<div class="custom-tooltip">' +
          `<i style='background: ${point.color.stops[0]};'></i>` +
          point.name +
          ' <span>' +
          point.y +
          '</span>' +
          '<span>' +
          point.percentage.toFixed(0) +
          '%</span>' +
          '</div>'
        );
      },
    },
    plotOptions: {
      pie: {
        allowPointSelect: true, //每个扇块能否选中
        cursor: 'pointer', //鼠标指针
        center: ['50%', '50%'],
        showInLegend: true,
        size: '130%',
        innerSize: 0,
        depth: 35, //饼图的厚度
        dataLabels: {
          enabled: false, //是否显示饼图的线形tip
          formatter: function() {
            let name = this.point.name;
            let value = this.y;
            return name + value + '%';
          },
        },
      },
    },
    credits: {
      enabled: false,
    },
    series: [
      {
        type: 'pie',
        data: [
          {
            name: '紧急告警',
            y: 10,
            h: 10,
          },
          {
            name: '重要告警',
            y: 10,
            h: 10,
          },
          {
            name: '普通告警 ',
            y: 15,
            h: 15,
          },
          {
            name: '提示告警',
            y: 30,
            h: 25,
          },
        ],
      },
    ],
  });

  function autoTooltip(point) {
    chart.tooltip && chart.tooltip.refresh(point);
  }
}

export default function Pie3d() {
  useEffect(() => {
    getPie('pie3d');

    window.addEventListener('resize', () => {
      getPie('pie3d');
    });
  }, []);
  return <div id="pie3d" className="waring-pie" style={{ height: '100%' }} />;
}


        .custom-tooltip {
          padding: 10px;
          color: #ecf5fe;
          background-size: cover;
          border-radius: 5px;
          /* 其他需要的样式 */
          background: url('~@/assets/img/busiMonitorSys/pie-hover.png') left center/100% 100%
            no-repeat;
          i {
            display: inline-block;
            width: 9px;
            height: 9px;
            border-radius: 50%;
            margin-right: 6px;
          }
          span {
            color: #23fffc;
            font-weight: 600;
            margin-left: 12px;
          }
        }

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在JavaScript中使用Highcharts实现3D饼图,你需要按照以下步骤进行配置和使用: 1. 首先,确保你已经引入了Highcharts库。你可以在HTML文件中通过使用`<script>`标签来引入Highcharts库的JavaScript文件。 2. 创建一个HTML容器来显示你的图表。在HTML文件中,你可以使用一个空的`<div>`元素,并为其指定一个唯一的ID,例如`<div id="chart-container"></div>`。这将是你的3D饼图的容器。 3. 在JavaScript文件中,你需要使用Highcharts的配置对象来定义你的3D饼图的设置。你可以通过创建一个名为`options`的对象来实现这一点。在`options`对象中,你可以指定图表的类型为`pie`,并设置`options.chart`属性为`{ type: 'pie', options3d: { enabled: true, alpha: 45, beta: 0 } }`以启用3D效果。 4. 在`options.series`属性中,你可以指定饼图的数据。每个数据点都是一个对象,包含`name`和`y`属性,分别表示数据点的名称和值。 5. 最后,你需要使用`Highcharts.chart`函数将图表绘制到指定的容器中。在JavaScript文件中,使用以下代码来创建和绘制3D饼图:`Highcharts.chart('chart-container', options);`。其中,`'chart-container'`是你在第2步中指定的容器的ID。 通过按照上述步骤进行配置和使用,你就能够在JavaScript中实现3D饼图的效果了。记得在绘制图表之前,确保你已经引入了Highcharts库,并正确配置了相关的设置和数据。<span class="em">1</span> #### 引用[.reference_title] - *1* [在Vue中使用highCharts绘制3d饼图的方法](https://download.csdn.net/download/weixin_38656609/13206251)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值