首页 > 其他分享 >amCharts绘制关联饼图

amCharts绘制关联饼图

时间:2024-05-30 17:58:46浏览次数:20  
标签:category 绘制 value 关联 amCharts series var root am5

案例1

  • 代码案例
<!DOCTYPE html>
<html>
  <head>
    <script src="https://cdn.amcharts.com/lib/5/index.js"></script>
    <script src="https://cdn.amcharts.com/lib/5/percent.js"></script>
    <script src="https://cdn.amcharts.com/lib/5/themes/Animated.js"></script>
    <style>
        #chartdiv {
          width: 650PX;
          height: 350px;
        }
    </style>
  </head>
  <body>
    <div id="chartdiv"></div>
    
    <script>
        am5.ready(function() {
        
        // Create root element
        // https://www.amcharts.com/docs/v5/getting-started/#Root_element
        var root = am5.Root.new("chartdiv");
        
        // Set themes
        // https://www.amcharts.com/docs/v5/concepts/themes/
        root.setThemes([
          am5themes_Animated.new(root)
        ]);
        
        root.container.set("layout", root.verticalLayout);
        
        // Create container to hold charts
        var chartContainer = root.container.children.push(am5.Container.new(root, {
          layout: root.horizontalLayout,
          width: am5.p100,
          height: am5.p100
        }));
        
        // Create the 1st chart
        // https://www.amcharts.com/docs/v5/charts/percent-charts/pie-chart/
        var chart = chartContainer.children.push(
          am5percent.PieChart.new(root, {
            endAngle: 270,
            innerRadius: am5.percent(60)
          })
        );
        
        
        var series = chart.series.push(
          am5percent.PieSeries.new(root, {
            valueField: "value",
            categoryField: "category",
            endAngle: 270,
            alignLabels: false
          })
        );
        
        series.children.push(am5.Label.new(root, {
          centerX: am5.percent(50),
          centerY: am5.percent(50),
          text: "First: {valueSum}",
          populateText: true,
          fontSize: "1.5em"
        }));
        
        series.slices.template.setAll({
          cornerRadius: 8
        })
        
        series.states.create("hidden", {
          endAngle: -90
        });
        
        series.labels.template.setAll({
          textType: "circular"
        });
        
        
        // Create the 2nd chart
        // https://www.amcharts.com/docs/v5/charts/percent-charts/pie-chart/
        var chart2 = chartContainer.children.push(
          am5percent.PieChart.new(root, {
            endAngle: 270,
            innerRadius: am5.percent(60)
          })
        );
        
        var series2 = chart2.series.push(
          am5percent.PieSeries.new(root, {
            valueField: "value",
            categoryField: "category",
            endAngle: 270,
            alignLabels: false,
            tooltip: am5.Tooltip.new(root, {}) // a separate tooltip needed for this series
          })
        );
        
        series2.children.push(am5.Label.new(root, {
          centerX: am5.percent(50),
          centerY: am5.percent(50),
          text: "Second: {valueSum}",
          populateText: true,
          fontSize: "1.5em"
        }));
        
        series2.slices.template.setAll({
          cornerRadius: 8
        })
        
        series2.states.create("hidden", {
          endAngle: -90
        });
        
        series2.labels.template.setAll({
          textType: "circular"
        });
        
        
        // Duplicate interaction
        // Must be added before setting data
        series.slices.template.events.on("pointerover", function(ev) {
          var slice = ev.target;
          var dataItem = slice.dataItem;
          var otherSlice = getSlice(dataItem, series2);
        
          if (otherSlice) {
            otherSlice.hover();
          }
        });
        
        series.slices.template.events.on("pointerout", function(ev) {
          var slice = ev.target;
          var dataItem = slice.dataItem;
          var otherSlice = getSlice(dataItem, series2);
        
          if (otherSlice) {
            otherSlice.unhover();
          }
        });
        
        series.slices.template.on("active", function(active, target) {
          var slice = target;
          var dataItem = slice.dataItem;
          var otherSlice = getSlice(dataItem, series2);
        
          if (otherSlice) {
            otherSlice.set("active", active);
          }
        });
        
        // Same for the 2nd series
        series2.slices.template.events.on("pointerover", function(ev) {
          var slice = ev.target;
          var dataItem = slice.dataItem;
          var otherSlice = getSlice(dataItem, series);
        
          if (otherSlice) {
            otherSlice.hover();
          }
        });
        
        series2.slices.template.events.on("pointerout", function(ev) {
          var slice = ev.target;
          var dataItem = slice.dataItem;
          var otherSlice = getSlice(dataItem, series);
        
          if (otherSlice) {
            otherSlice.unhover();
          }
        });
        
        series2.slices.template.on("active", function(active, target) {
          var slice = target;
          var dataItem = slice.dataItem;
          var otherSlice = getSlice(dataItem, series);
        
          if (otherSlice) {
            otherSlice.set("active", active);
          }
        });
        
        
        // Set data
        // https://www.amcharts.com/docs/v5/charts/percent-charts/pie-chart/#Setting_data
        series.data.setAll([{
          category: "Lithuania",
          value: 501
        }, {
          category: "Czechia",
          value: 301
        }, {
          category: "Ireland",
          value: 201
        }, {
          category: "Germany",
          value: 165
        }]);
        
        // Set data
        // https://www.amcharts.com/docs/v5/charts/percent-charts/pie-chart/#Setting_data
        series2.data.setAll([{
          category: "Lithuania",
          value: 201
        }, {
          category: "Czechia",
          value: 101
        }, {
          category: "Ireland",
          value: 51
        }, {
          category: "Germany",
          value: 15
        }]);
        
        
        
        function getSlice(dataItem, series) {
          var otherSlice;
          am5.array.each(series.dataItems, function(di) {
            if (di.get("category") === dataItem.get("category")) {
              otherSlice = di.get("slice");
            }
          });
        
          return otherSlice;
        }
        
        // Create legend
        var legend = root.container.children.push(am5.Legend.new(root, {
          x: am5.percent(50),
          centerX: am5.percent(50)
        }));
        
        
        // Trigger all the same for the 2nd series
        legend.itemContainers.template.events.on("pointerover", function(ev) {
          var dataItem = ev.target.dataItem.dataContext;
          var slice = getSlice(dataItem, series2);
          slice.hover();
        });
        
        legend.itemContainers.template.events.on("pointerout", function(ev) {
          var dataItem = ev.target.dataItem.dataContext;
          var slice = getSlice(dataItem, series2);
          slice.unhover();
        });
        
        legend.itemContainers.template.on("disabled", function(disabled, target) {
          var dataItem = target.dataItem.dataContext;
          var slice = getSlice(dataItem, series2);
          if (disabled) {
            series2.hideDataItem(slice.dataItem);
          }
          else {
            series2.showDataItem(slice.dataItem);
          }
        });
        
        legend.data.setAll(series.dataItems);
        
        series.appear(1000, 100);
        
        }); // end am5.ready()
    </script>
  </body>
</html>
  • 效果图
点击查看详情

案例2

  • 代码案例
<!DOCTYPE html>
<html>
  <head>
    <script src="https://cdn.amcharts.com/lib/5/index.js"></script>
    <script src="https://cdn.amcharts.com/lib/5/percent.js"></script>
    <script src="https://cdn.amcharts.com/lib/5/themes/Animated.js"></script>
    <style>
        #chartdiv {
          width: 650PX;
          height: 350px;
        }
    </style>
  </head>
  <body>
    <div id="chartdiv"></div>
    
    <script>
        am5.ready(function() {
        
        // Create root element
        // https://www.amcharts.com/docs/v5/getting-started/#Root_element
        var root = am5.Root.new("chartdiv");
        
        // Create custom theme
        // https://www.amcharts.com/docs/v5/concepts/themes/#Quick_custom_theme
        var myTheme = am5.Theme.new(root);
        myTheme.rule("Label").set("fontSize", "0.8em");
        
        // Set themes
        // https://www.amcharts.com/docs/v5/concepts/themes/
        root.setThemes([
          am5themes_Animated.new(root),
          myTheme
        ]);
        
        // Create wrapper container
        var container = root.container.children.push(am5.Container.new(root, {
          width: am5.p100,
          height: am5.p100,
          layout: root.horizontalLayout
        }));
        
        // Create first chart
        // https://www.amcharts.com/docs/v5/charts/percent-charts/pie-chart/
        var chart0 = container.children.push(am5percent.PieChart.new(root, {
          innerRadius: am5.p50,
          tooltip: am5.Tooltip.new(root, {})
        }));
        
        // Create series
        // https://www.amcharts.com/docs/v5/charts/percent-charts/pie-chart/#Series
        var series0 = chart0.series.push(am5percent.PieSeries.new(root, {
          valueField: "value",
          categoryField: "category",
          alignLabels: false
        }));
        
        series0.labels.template.setAll({
          textType: "circular",
          templateField: "dummyLabelSettings"
        });
        
        series0.ticks.template.set("forceHidden", true);
        
        var sliceTemplate0 = series0.slices.template;
        sliceTemplate0.setAll({
          draggable: true,
          templateField: "settings",
          cornerRadius: 5
        });
        
        // Separator line
        container.children.push(am5.Line.new(root, {
          layer: 1,
          height: am5.percent(60),
          y: am5.p50,
          centerY: am5.p50,
          strokeDasharray: [4, 4],
          stroke: root.interfaceColors.get("alternativeBackground"),
          strokeOpacity: 0.5
        }));
        
        // Label
        container.children.push(am5.Label.new(root, {
          layer: 1,
          text: "Drag slices over the line",
          y: am5.p50,
          textAlign: "center",
          rotation: -90,
          isMeasured: false
        }));
        
        // Create second chart
        // https://www.amcharts.com/docs/v5/charts/percent-charts/pie-chart/
        var chart1 = container.children.push(am5percent.PieChart.new(root, {
          innerRadius: am5.p50,
          tooltip: am5.Tooltip.new(root, {})
        }));
        
        // Create series
        // https://www.amcharts.com/docs/v5/charts/percent-charts/pie-chart/#Series
        var series1 = chart1.series.push(am5percent.PieSeries.new(root, {
          valueField: "value",
          categoryField: "category",
          alignLabels: false
        }));
        
        series1.labels.template.setAll({
          textType: "circular",
          radius: 20,
          templateField: "dummyLabelSettings"
        });
        
        series1.ticks.template.set("forceHidden", true);
        
        var sliceTemplate1 = series1.slices.template;
        sliceTemplate1.setAll({
          draggable: true,
          templateField: "settings",
          cornerRadius: 5
        });
        
        var previousDownSlice;
        
        // change layers when down
        sliceTemplate0.events.on("pointerdown", function (e) {
          if (previousDownSlice) {
            //  previousDownSlice.set("layer", 0);
          }
          e.target.set("layer", 1);
          previousDownSlice = e.target;
        });
        
        sliceTemplate1.events.on("pointerdown", function (e) {
          if (previousDownSlice) {
            // previousDownSlice.set("layer", 0);
          }
          e.target.set("layer", 1);
          previousDownSlice = e.target;
        });
        
        // when released, do all the magic
        sliceTemplate0.events.on("pointerup", function (e) {
          series0.hideTooltip();
          series1.hideTooltip();
        
          var slice = e.target;
          if (slice.x() > container.width() / 4) {
            var index = series0.slices.indexOf(slice);
            slice.dataItem.hide();
        
            var series1DataItem = series1.dataItems[index];
            series1DataItem.show();
            series1DataItem.get("slice").setAll({ x: 0, y: 0 });
        
            handleDummy(series0);
            handleDummy(series1);
          } else {
            slice.animate({
              key: "x",
              to: 0,
              duration: 500,
              easing: am5.ease.out(am5.ease.cubic)
            });
            slice.animate({
              key: "y",
              to: 0,
              duration: 500,
              easing: am5.ease.out(am5.ease.cubic)
            });
          }
        });
        
        sliceTemplate1.events.on("pointerup", function (e) {
          var slice = e.target;
        
          series0.hideTooltip();
          series1.hideTooltip();
        
          if (slice.x() < container.width() / 4) {
            var index = series1.slices.indexOf(slice);
            slice.dataItem.hide();
        
            var series0DataItem = series0.dataItems[index];
            series0DataItem.show();
            series0DataItem.get("slice").setAll({ x: 0, y: 0 });
        
            handleDummy(series0);
            handleDummy(series1);
          } else {
            slice.animate({
              key: "x",
              to: 0,
              duration: 500,
              easing: am5.ease.out(am5.ease.cubic)
            });
            slice.animate({
              key: "y",
              to: 0,
              duration: 500,
              easing: am5.ease.out(am5.ease.cubic)
            });
          }
        });
        
        // data
        var data = [
          {
            category: "Dummy",
            value: 1000,
            settings: {
              fill: am5.color(0xdadada),
              stroke: am5.color(0xdadada),
              fillOpacity: 0.3,
              strokeDasharray: [4, 4],
              tooltipText: null,
              draggable: false
            },
            dummyLabelSettings: {
              forceHidden: true
            }
          },
          {
            category: "Lithuania",
            value: 501.9
          },
          {
            category: "Estonia",
            value: 301.9
          },
          {
            category: "Ireland",
            value: 201.1
          },
          {
            category: "Germany",
            value: 165.8
          },
          {
            category: "Australia",
            value: 139.9
          },
          {
            category: "Austria",
            value: 128.3
          }
        ];
        
        // show/hide dummy slice depending if there are other visible slices
        function handleDummy(series) {
          // count visible data items
          var visibleCount = 0;
          am5.array.each(series.dataItems, function (dataItem) {
            if (!dataItem.isHidden()) {
              visibleCount++;
            }
          });
          // if all hidden, show dummy
          if (visibleCount == 0) {
            series.dataItems[0].show();
          } else {
            series.dataItems[0].hide();
          }
        }
        // set data
        series0.data.setAll(data);
        series1.data.setAll(data);
        
        // hide all except dummy
        am5.array.each(series1.dataItems, function (dataItem) {
          if (dataItem.get("category") != "Dummy") {
            dataItem.hide(0);
          }
        });
        
        // hide dummy
        series0.dataItems[0].hide(0);
        
        // reveal container
        container.appear(1000, 100);
        
        }); // end am5.ready()
    </script>        
  </body>
</html>
  • 效果图
点击查看详情

案例3

  • 代码案例
<!DOCTYPE html>
<html>
  <head>
    <script src="https://cdn.amcharts.com/lib/5/index.js"></script>
    <script src="https://cdn.amcharts.com/lib/5/percent.js"></script>
    <script src="https://cdn.amcharts.com/lib/5/themes/Animated.js"></script>
    <style>
        #chartdiv {
          width: 750PX;
          height: 350px;
        }
    </style>
  </head>
  <body>
    <div id="chartdiv"></div>
    
    <script>
        am5.ready(function() {
        
        // Create root element
        // https://www.amcharts.com/docs/v5/getting-started/#Root_element
        var root = am5.Root.new("chartdiv");
        
        // Set themes
        // https://www.amcharts.com/docs/v5/concepts/themes/
        root.setThemes([am5themes_Animated.new(root)]);
        
        var container = root.container.children.push(
          am5.Container.new(root, {
            width: am5.p100,
            height: am5.p100,
            layout: root.horizontalLayout
          })
        );
        
        // Create main chart
        // https://www.amcharts.com/docs/v5/charts/percent-charts/pie-chart/
        var chart = container.children.push(
          am5percent.PieChart.new(root, {
            tooltip: am5.Tooltip.new(root, {})
          })
        );
        
        // Create series
        // https://www.amcharts.com/docs/v5/charts/percent-charts/pie-chart/#Series
        var series = chart.series.push(
          am5percent.PieSeries.new(root, {
            valueField: "value",
            categoryField: "category",
            alignLabels: false
          })
        );
        
        series.labels.template.setAll({
          textType: "circular",
          radius: 4
        });
        series.ticks.template.set("visible", false);
        series.slices.template.set("toggleKey", "none");
        
        // add events
        series.slices.template.events.on("click", function(e) {
          selectSlice(e.target);
        });
        
        // Create sub chart
        // https://www.amcharts.com/docs/v5/charts/percent-charts/pie-chart/
        var subChart = container.children.push(
          am5percent.PieChart.new(root, {
            radius: am5.percent(50),
            tooltip: am5.Tooltip.new(root, {})
          })
        );
        
        // Create sub series
        // https://www.amcharts.com/docs/v5/charts/percent-charts/pie-chart/#Series
        var subSeries = subChart.series.push(
          am5percent.PieSeries.new(root, {
            valueField: "value",
            categoryField: "category"
          })
        );
        
        subSeries.data.setAll([
          { category: "A", value: 0 },
          { category: "B", value: 0 },
          { category: "C", value: 0 },
          { category: "D", value: 0 },
          { category: "E", value: 0 },
          { category: "F", value: 0 },
          { category: "G", value: 0 }
        ]);
        subSeries.slices.template.set("toggleKey", "none");
        
        var selectedSlice;
        
        series.on("startAngle", function() {
          updateLines();
        });
        
        container.events.on("boundschanged", function() {
          root.events.once("frameended", function() {
            updateLines();
           })
        });
        
        function updateLines() {
          if (selectedSlice) {
            var startAngle = selectedSlice.get("startAngle");
            var arc = selectedSlice.get("arc");
            var radius = selectedSlice.get("radius");
        
            var x00 = radius * am5.math.cos(startAngle);
            var y00 = radius * am5.math.sin(startAngle);
        
            var x10 = radius * am5.math.cos(startAngle + arc);
            var y10 = radius * am5.math.sin(startAngle + arc);
        
            var subRadius = subSeries.slices.getIndex(0).get("radius");
            var x01 = 0;
            var y01 = -subRadius;
        
            var x11 = 0;
            var y11 = subRadius;
        
            var point00 = series.toGlobal({ x: x00, y: y00 });
            var point10 = series.toGlobal({ x: x10, y: y10 });
        
            var point01 = subSeries.toGlobal({ x: x01, y: y01 });
            var point11 = subSeries.toGlobal({ x: x11, y: y11 });
        
            line0.set("points", [point00, point01]);
            line1.set("points", [point10, point11]);
          }
        }
        
        // lines
        var line0 = container.children.push(
          am5.Line.new(root, {
            position: "absolute",
            stroke: root.interfaceColors.get("text"),
            strokeDasharray: [2, 2]
          })
        );
        var line1 = container.children.push(
          am5.Line.new(root, {
            position: "absolute",
            stroke: root.interfaceColors.get("text"),
            strokeDasharray: [2, 2]
          })
        );
        
        // Set data
        // https://www.amcharts.com/docs/v5/charts/percent-charts/pie-chart/#Setting_data
        series.data.setAll([
          {
            category: "Lithuania",
            value: 500,
            subData: [
              { category: "A", value: 200 },
              { category: "B", value: 150 },
              { category: "C", value: 100 },
              { category: "D", value: 100 }
            ]
          },
          {
            category: "Czechia",
            value: 300,
            subData: [
              { category: "A", value: 150 }
            ]
          },
          {
            category: "Ireland",
            value: 200,
            subData: [
              { category: "A", value: 110 },
              { category: "B", value: 60 },
              { category: "C", value: 30 }
            ]
          },
          {
            category: "Germany",
            value: 150,
            subData: [
              { category: "A", value: 80 },
              { category: "B", value: 40 },
              { category: "C", value: 30 }
            ]
          },
          {
            category: "Australia",
            value: 140,
            subData: [
              { category: "A", value: 90 },
              { category: "B", value: 40 },
              { category: "C", value: 10 }
            ]
          },
          {
            category: "Austria",
            value: 120,
            subData: [
              { category: "A", value: 60 },
              { category: "B", value: 30 },
              { category: "C", value: 30 }
            ]
          }
        ]);
        
        function selectSlice(slice) {
          selectedSlice = slice;
          var dataItem = slice.dataItem;
          var dataContext = dataItem.dataContext;
        
          if (dataContext) {
            var i = 0;
            subSeries.data.each(function(dataObject) {
              var dataObj = dataContext.subData[i];
              if(dataObj){
                  if(!subSeries.dataItems[i].get("visible")){
                      subSeries.dataItems[i].show();
                  }
                  subSeries.data.setIndex(i, dataObj);
              }
              else{
                  subSeries.dataItems[i].hide();
              }
              
              i++;
            });
          }
        
          var middleAngle = slice.get("startAngle") + slice.get("arc") / 2;
          var firstAngle = series.dataItems[0].get("slice").get("startAngle");
        
          series.animate({
            key: "startAngle",
            to: firstAngle - middleAngle,
            duration: 1000,
            easing: am5.ease.out(am5.ease.cubic)
          });
          series.animate({
            key: "endAngle",
            to: firstAngle - middleAngle + 360,
            duration: 1000,
            easing: am5.ease.out(am5.ease.cubic)
          });
        }
        
        container.appear(1000, 10);
        
        series.events.on("datavalidated", function() {
          selectSlice(series.slices.getIndex(0));
        });
        
        }); // end am5.ready()
    </script>            
  </body>
</html>
  • 效果图
点击查看详情

标签:category,绘制,value,关联,amCharts,series,var,root,am5
From: https://www.cnblogs.com/dogleftover/p/18222936

相关文章

  • amCharts绘制甜甜圈
    案例1代码案例<!DOCTYPEhtml><html><head><scriptsrc="https://cdn.amcharts.com/lib/5/index.js"></script><scriptsrc="https://cdn.amcharts.com/lib/5/percent.js"></script><scri......
  • amCharts绘制饼图
    案例1代码案例<!DOCTYPEhtml><html><head><scriptsrc="https://cdn.amcharts.com/lib/5/index.js"></script><scriptsrc="https://cdn.amcharts.com/lib/5/percent.js"></script><scri......
  • amCharts绘制带趋势线折线图
    代码案例<!DOCTYPEhtml><html><head><scriptsrc="https://cdn.amcharts.com/lib/5/index.js"></script><scriptsrc="https://cdn.amcharts.com/lib/5/xy.js"></script><scriptsrc=&qu......
  • amCharts绘制折线图尾部动画
    代码案例<!DOCTYPEhtml><html><head><scriptsrc="https://cdn.amcharts.com/lib/5/index.js"></script><scriptsrc="https://cdn.amcharts.com/lib/5/xy.js"></script><scriptsrc=&qu......
  • amCharts绘制折线图和柱状图混合
    代码案例<!DOCTYPEhtml><html><head><scriptsrc="https://cdn.amcharts.com/lib/5/index.js"></script><scriptsrc="https://cdn.amcharts.com/lib/5/xy.js"></script><scriptsrc=&qu......
  • amCharts绘制堆叠面积图
    代码案例<!DOCTYPEhtml><html><head><scriptsrc="https://cdn.amcharts.com/lib/5/index.js"></script><scriptsrc="https://cdn.amcharts.com/lib/5/xy.js"></script><scriptsrc=&qu......
  • amCharts绘制折线图比较
    代码案例<!DOCTYPEhtml><html><head><scriptsrc="https://cdn.amcharts.com/lib/5/index.js"></script><scriptsrc="https://cdn.amcharts.com/lib/5/xy.js"></script><scriptsrc=&qu......
  • 地质灾害风险地图:如何用GIS与Python绘制
    地质灾害是指全球地壳自然地质演化过程中,由于地球内动力、外动力或者人为地质动力作用下导致的自然地质和人类的自然灾害突发事件。由于降水、地震等自然作用下,地质灾害在世界范围内频繁发生。我国除滑坡灾害外,还包括崩塌、泥石流、地面沉降等各种地质灾害,具有类型多样、分......
  • Hive中常用query--关联/聚合/去重/排序举例
    在Hive中,可以使用各种查询来执行关联(JOINs)、聚合(Aggregations)、去重(Distinct)和排序(Sorting)操作。以下是一些常见的查询示例:关联(JOIN):在Hive中执行关联操作通常是为了将两个或多个表中相关的行连接起来。SELECTe.name,e.salary,d.department_nameFROMemployeeseJOIN......
  • Highcharts绘制饼图
    代码案例<html> <head> <metahttp-equiv="Content-Type"content="text/html;charset=utf-8"> <metaname="viewport"content="width=device-width,initial-scale=1"> <title>HighchartsExa......