【问题标题】:Controlling Multiple Charts with a Single Jquery UI Slider使用单个 Jquery UI 滑块控制多个图表
【发布时间】:2019-10-01 16:16:53
【问题描述】:

我正在使用 AM Charts 4 的“聚集饼图”示例 (https://codepen.io/team/amcharts/pen/XGRYYp)。我为每个图表添加了多个数据集,并尝试使用 Jquery UI Slider 循环浏览这些数据集。我基本上是在尝试使用 UI Slider 来控制多个图表以及这些图表的相应数据集。我似乎无法让滑块识别数据集的名称。绝对是滑动功能的问题。有任何人对此有经验吗?任何见解将不胜感激!

我能够将单个滑块与单个图表/数据集配对 (https://codepen.io/greg-griffith/pen/Rwbmpga),但在尝试将单个滑块与多个图表/数据集配对时运气不佳。

// Create chart instance
var container = am4core.create("chartdiv", am4core.Container);
container.width = am4core.percent(100);
container.height = am4core.percent(100);
container.layout = "horizontal";

am4core.useTheme(am4themes_animated);
am4core.useTheme(am4themes_material);

function createChart(data) {

  // Create chart
  var chart = container.createChild(am4charts.PieChart);

  // Add data
  chart.data = data;

  // Add and configure Series
  var pieSeries = chart.series.push(new am4charts.PieSeries());
  pieSeries.dataFields.value = "value";
  pieSeries.dataFields.category = "country";
 // pieSeries.labels.template.disabled = true;
  //pieSeries.ticks.template.disabled = true;
  
};

createChart([
        { country: "U.S. Equities", value: 50},
        { country: "U.S. Fixed Income",value: 40},
        { country: "Hybrid Strategy", value: 10},
        ],
     // 40/40/20
        [
        { country: "U.S. Equities", value: 40},
        { country: "U.S. Fixed Income", value: 40},
        { country: "Hybrid Strategy", value: 20},
        
    ],
   // 30/40/30
    [
        { country: "U.S. Equities", value: 30},
        { country: "U.S. Fixed Income", value:40},
        { country: "Hybrid Strategy", value: 30},
       
    ],
     // 20/40/40
    [
        { country: "U.S. Equities", value: 20},
        { country: "U.S. Fixed Incomed", value: 40},
        { country: "Hybrid Strategy", value: 40},
       
    ],
    // 10/40/50
    [
        { country: "U.S. Equities", value: 10},
        { country: "U.S. Fixed Income", value: 40},
        { country: "Hybrid Strategy", values: 50},
        
    ]);

createChart([
        { country: "U.S. Equities", value: 0.55},
        { country: "U.S. Fixed Income", value: 0.40},
        { country: "Hybrid Strategy", value: 0.07},
        ],
     // 40/40/20
        [
        { country: "U.S. Equities", value: .50},
        { country: "U.S. Fixed Income", value: .40},
        { country: "Hybrid Strategy", value: .14},
        
    ],
   // 30/40/30
    [
        { country: "U.S. Equities", value: .45},
        { country: "U.S. Fixed Income", value: .40},
        { country: "Hybrid Strategy", value: .21},
       
    ],
     // 20/40/40
    [
        { country: "U.S. Equities", value: .40},
        { country: "U.S. Fixed Incomed", value: .40},
        { country: "Hybrid Strategy", value: .28},
       
    ],
    // 10/40/50
    [
        { country: "U.S. Equities", value: .35},
        { country: "U.S. Fixed Income", value: .40},
        { country: "Hybrid Strategy", value: .35},
        
    ]);

createChart([
        { country: "U.S. Equities", value: 52},
        { country: "U.S. Fixed Income", value: 38},
        { country: "Hybrid Strategy", value: 10},
        ],
     // 40/40/20
        [
        { country: "U.S. Equities", value: .50},
        { country: "U.S. Fixed Income", value: .40},
        { country: "Hybrid Strategy", value: .14},
        
    ],
   // 30/40/30
    [
        { country: "U.S. Equities", value: .45},
        { country: "U.S. Fixed Income", value: .40},
        { country: "Hybrid Strategy", value: .21},
       
    ],
     // 20/40/40
    [
        { country: "U.S. Equities", value: .40},
        { country: "U.S. Fixed Incomed", value: .40},
        { country: "Hybrid Strategy", value: .28},
       
    ],
    // 10/40/50
    [
        { country: "U.S. Equities", value: .35},
        { country: "U.S. Fixed Income", value: .40},
        { country: "Hybrid Strategy", value: .35},
        
    ]);



$(function() {
  $("#slider").slider({
    //range: true,
    min: 0,
    max: 4,
    step: 1,
    value: 0,
    create: function(event, ui) {
      var dataSet = data[0];
      $("#slider .ui-slider-handle").text(dataSet.category);
    },
    slide: function(event, ui) {
      var dataSet = data[ui.value];
      chart.data = dataSet;
      chart.validateData();
      $(ui.handle).text(dataSet.category);
    },
    
  });
});
body {
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
}

#chartdiv {
  width: 100%;
  height: 200px;
}

#slider {
  margin-top: 20px;
}

.ui-slider .ui-slider-handle {
  width: 3.2em!important;
  text-align: center;
  margin-left: -1.6em!important;
}
<link rel="stylesheet" href="//code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css">
<script src="//code.jquery.com/jquery-1.10.2.js"></script>

<script src="//code.jquery.com/ui/1.11.4/jquery-ui.js"></script>

<script src="https://www.amcharts.com/lib/4/core.js"></script>
<script src="https://www.amcharts.com/lib/4/charts.js"></script>
<script src="https://www.amcharts.com/lib/4/themes/material.js"></script>
<script src="https://www.amcharts.com/lib/4/themes/animated.js"></script>

<div class="container">

<div id="chartdiv">
  
  
  </div>
 <div id="slider"></div>
</div>

【问题讨论】:

  • 欢迎来到 Stack Overflow。回顾这一点,您的数据结构和尝试看起来很重要。滑块适用于整数值。我看不到的一件事是:var dataSet = data[0];data 定义在哪里?
  • 这就是让我绊倒的地方。不确定当前的数组格式是否适用于 UI 滑块。或者,如果可以,不确定如何在滑块函数中引用数据集。 AM Charts 用于此示例的方法对数据集的格式设置与其他示例略有不同。
  • 好吧,我看不到 data 在滑块范围内的任何位置定义的位置。与chart 相同
  • 是的,你是对的。在其他示例中,它们明确定义了驱动图表的数组,例如“var chartData = array info”。在多个图表示例中,它们不遵循这种格式。

标签: jquery jquery-ui amcharts amcharts4


【解决方案1】:

我会坦率地说,我从来没有使用过这个库并且查看文档,它们没有什么帮助。

这是一个基本的工作示例:

var dataset = [];
dataset.push([{
      country: "U.S. Equities",
      value: 50
    },
    {
      country: "U.S. Fixed Income",
      value: 40
    },
    {
      country: "Hybrid Strategy",
      value: 10
    },
  ],
  // 40/40/20
  [{
      country: "U.S. Equities",
      value: 40
    },
    {
      country: "U.S. Fixed Income",
      value: 40
    },
    {
      country: "Hybrid Strategy",
      value: 20
    },

  ],
  // 30/40/30
  [{
      country: "U.S. Equities",
      value: 30
    },
    {
      country: "U.S. Fixed Income",
      value: 40
    },
    {
      country: "Hybrid Strategy",
      value: 30
    },

  ],
  // 20/40/40
  [{
      country: "U.S. Equities",
      value: 20
    },
    {
      country: "U.S. Fixed Incomed",
      value: 40
    },
    {
      country: "Hybrid Strategy",
      value: 40
    },

  ],
  // 10/40/50
  [{
      country: "U.S. Equities",
      value: 10
    },
    {
      country: "U.S. Fixed Income",
      value: 40
    },
    {
      country: "Hybrid Strategy",
      values: 50
    },

  ]);
dataset.push([{
      country: "U.S. Equities",
      value: 0.55
    },
    {
      country: "U.S. Fixed Income",
      value: 0.40
    },
    {
      country: "Hybrid Strategy",
      value: 0.07
    },
  ],
  // 40/40/20
  [{
      country: "U.S. Equities",
      value: 0.50
    },
    {
      country: "U.S. Fixed Income",
      value: 0.40
    },
    {
      country: "Hybrid Strategy",
      value: 0.14
    },

  ],
  // 30/40/30
  [{
      country: "U.S. Equities",
      value: 0.45
    },
    {
      country: "U.S. Fixed Income",
      value: 0.40
    },
    {
      country: "Hybrid Strategy",
      value: 0.21
    },

  ],
  // 20/40/40
  [{
      country: "U.S. Equities",
      value: 0.40
    },
    {
      country: "U.S. Fixed Incomed",
      value: 0.40
    },
    {
      country: "Hybrid Strategy",
      value: 0.28
    },

  ],
  // 10/40/50
  [{
      country: "U.S. Equities",
      value: 0.35
    },
    {
      country: "U.S. Fixed Income",
      value: 0.40
    },
    {
      country: "Hybrid Strategy",
      value: 0.35
    },

  ]);
dataset.push([{
      country: "U.S. Equities",
      value: 52
    },
    {
      country: "U.S. Fixed Income",
      value: 38
    },
    {
      country: "Hybrid Strategy",
      value: 10
    },
  ],
  // 40/40/20
  [{
      country: "U.S. Equities",
      value: 0.50
    },
    {
      country: "U.S. Fixed Income",
      value: 0.40
    },
    {
      country: "Hybrid Strategy",
      value: 0.14
    },

  ],
  // 30/40/30
  [{
      country: "U.S. Equities",
      value: 0.45
    },
    {
      country: "U.S. Fixed Income",
      value: 0.40
    },
    {
      country: "Hybrid Strategy",
      value: 0.21
    },

  ],
  // 20/40/40
  [{
      country: "U.S. Equities",
      value: 0.40
    },
    {
      country: "U.S. Fixed Incomed",
      value: 0.40
    },
    {
      country: "Hybrid Strategy",
      value: 0.28
    },

  ],
  // 10/40/50
  [{
      country: "U.S. Equities",
      value: 0.35
    },
    {
      country: "U.S. Fixed Income",
      value: 0.40
    },
    {
      country: "Hybrid Strategy",
      value: 0.35
    }
  ]);

$(function() {
  am4core.useTheme(am4themes_animated);
  am4core.useTheme(am4themes_material);
  var container = am4core.create("chartdiv", am4core.Container);
  container.width = am4core.percent(100);
  container.height = am4core.percent(100);
  container.layout = "horizontal";

  function drawChart(d, c) {
    // Create chart
    var chart = c.createChild(am4charts.PieChart);

    // Add data
    chart.data = d;

    // Add and configure Series
    var pieSeries = chart.series.push(new am4charts.PieSeries());
    pieSeries.dataFields.value = "value";
    pieSeries.dataFields.category = "country";

    return chart;
  }


  $("#slider").slider({
    min: 0,
    max: 4,
    step: 1,
    value: 0,
    create: function(event, ui) {
      var dataSet = dataset[0];
      $("#slider .ui-slider-handle").text(dataSet.category);
    },
    slide: function(event, ui) {
      var curDataSet = dataset[ui.value];
      var chart = drawChart(curDataSet, container);
      chart.validateData();
      $(ui.handle).text(curDataSet.category);
    }
  });
});
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<script src="https://www.amcharts.com/lib/4/core.js"></script>
<script src="https://www.amcharts.com/lib/4/charts.js"></script>
<script src="https://www.amcharts.com/lib/4/themes/material.js"></script>
<script src="https://www.amcharts.com/lib/4/themes/animated.js"></script>
<div class="container">
  <div id="chartdiv"></div>
  <div id="slider"></div>
</div>

它有一些问题。例如,我怀疑您希望图表在加载下一个数据之前清除当前数据。我无法确定这是如何使用图表或容器完成的。因此,图表堆积如山,但数据集正在更改为所需的数据集。

您还引用了一个似乎不存在的索引:category。我不确定你想用这个来完成什么。

【讨论】:

  • 我认为您在定义数据集变量方面走在了正确的轨道上。这是关键,我想。我将根据您的建议对其进行修补。非常感谢您对此的帮助!
  • @Griffigr 太棒了!如果它有帮助,我希望你想upvote它。如果它回答了问题,请标记它。
【解决方案2】:

我能够通过构建单独的数组并将它们重新绑定到幻灯片函数中来实现这一点。 AM Charts 中的“Clusted Pie Charts”示例有点糟糕,偏离了调用和构建数组的典型方法。非常感谢@Twisty 为我指明了正确的方向。

function am4themes_myTheme(target) {
  if (target instanceof am4core.ColorSet) {
    target.list = [
      am4core.color("#0063a0"),
      am4core.color("#c0504d"),
      am4core.color("#51d3d0")
          ];
  }
}


// Set theme
am4core.useTheme(am4themes_animated);
am4core.useTheme(am4themes_myTheme);

// Create chart instance
var chart = am4core.create("chartdiv", am4charts.PieChart);
var chart2 = am4core.create("chartdiv2", am4charts.PieChart);

var chartData = [
    // 50/40/10
    [
        { country: "U.S. Equities", value: 50},
        { country: "U.S. Fixed Income",value: 40},
        { country: "Hybrid Strategy", value: 10},
        ],
     // 40/40/20
        [
        { country: "U.S. Equities", value: 40},
        { country: "U.S. Fixed Income", value: 40},
        { country: "Hybrid Strategy", value: 20},
        
    ],
   // 30/40/30
    [
        { country: "U.S. Equities", value: 30},
        { country: "U.S. Fixed Income", value:40},
        { country: "Hybrid Strategy", value: 30},
       
    ],
     // 20/40/40
    [
        { country: "U.S. Equities", value: 20},
        { country: "U.S. Fixed Incomed", value: 40},
        { country: "Hybrid Strategy", value: 40},
       
    ],
    // 10/40/50
    [
        { country: "U.S. Equities", value: 10},
        { country: "U.S. Fixed Income", value: 40},
        { country: "Hybrid Strategy", value: 50},
        
    ]
];

var chart2Data = [
    // 50/40/10
    [
        { country: "U.S. Equities", value: 0.55},
        { country: "U.S. Fixed Income", value: 0.40},
        { country: "Hybrid Strategy", value: 0.07},
        ],
     // 40/40/20
        [
        { country: "U.S. Equities", value: .50},
        { country: "U.S. Fixed Income", value: .40},
        { country: "Hybrid Strategy", value: .14},
        
    ],
   // 30/40/30
    [
        { country: "U.S. Equities", value: .45},
        { country: "U.S. Fixed Income", value: .40},
        { country: "Hybrid Strategy", value: .21},
       
    ],
     // 20/40/40
    [
        { country: "U.S. Equities", value: .40},
        { country: "U.S. Fixed Incomed", value: .40},
        { country: "Hybrid Strategy", value: .28},
       
    ],
    // 10/40/50
    [
        { country: "U.S. Equities", value: .35},
        { country: "U.S. Fixed Income", value: .40},
        { country: "Hybrid Strategy", value: .35},
        
    ]
];

// Add data
chart.data = chartData[0];

// Add and configure Series
var pieSeries = chart.series.push(new am4charts.PieSeries());
pieSeries.dataFields.value = "value";
pieSeries.dataFields.category = "country";

// Let's cut a hole in our Pie chart the size of 40% the radius
chart.innerRadius = am4core.percent(40);

// Put a thick white border around each Slice
pieSeries.slices.template.stroke = am4core.color("#4a2abb");
pieSeries.slices.template.strokeWidth = 2;
pieSeries.slices.template.strokeOpacity = 1;


chart2.data = chart2Data[0];

// Add and configure Series
var pieSeries2 = chart2.series.push(new am4charts.PieSeries());
pieSeries2.dataFields.value = "value";
pieSeries2.dataFields.category = "country";

// Let's cut a hole in our Pie chart the size of 40% the radius
chart2.innerRadius = am4core.percent(40);

// Put a thick white border around each Slice
pieSeries2.slices.template.stroke = am4core.color("#4a2abb");
pieSeries2.slices.template.strokeWidth = 2;
pieSeries2.slices.template.strokeOpacity = 1;


// Add a legend
chart.legend = new am4charts.Legend();
chart2.legend = new am4charts.Legend();

function selectDataset(d) {
    chart.data = chartData[d];
    chart.validateData();
    chart.animateAgain();
}

function selectDataset2(d) {
    chart2.data = chart2Data[d];
    chart2.validateData();
    chart2.animateAgain();
}

var label = pieSeries2.createChild(am4core.Label);
label.text = "${values.value.sum}";
label.horizontalCenter = "middle";
label.verticalCenter = "middle";
label.fontSize = 40;

$(function() {
  $("#slider").slider({
    range: false,
    min: 0,
    max: 4,
    step: 1,
    value: 0,
    create: function(event, ui) {
      var dataSet = (chartData[0],chart2Data[0]);
      $("#slider .ui-slider-handle").text(dataSet.category);
    },
    slide: function(event, ui) {
      var dataSet = (chartData[ui.value]);
      var dataSet2 = (chart2Data[ui.value]);
      // var dataSet = (chartData[ui.value], chart2Data[ui.value]);
      chart2.data = dataSet2;
      chart.data = dataSet;
      chart2.validateData();
      chart.validateData();
      $(ui.handle).text(dataSet.category);
    }
  });
});

$( "#slider" ).slider({
    value: 10,
    min: 10,
    max: 50,
    step: 10
})
.each(function() {

  //
  // Add labels to slider whose values 
  // are specified by min, max and whose
  // step is set to 1
  //

  // Get the options for this slider
  var opt = $(this).data().uiSlider.options;
  
  // Get the number of possible values
  var vals = opt.max - opt.min;
  
  // Space out values
  for (var i = 0; i <= vals; i++) {
    
    var el = $('<label>'+(i*10+10)+'%'+'</label>').css('left',(i/vals*1000)+'%');
  
    $( "#slider" ).append(el);
    
  }
  
});
body {
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
}

.container 
{
  margin-top: 100px;
}
#chartdiv, #chartdiv2 {
  width: 100%;
  height: 400px;
}

#slider {
  margin-top: 20px;
}

.ui-slider .ui-slider-handle {
  width: 3.2em!important;
  text-align: center;
  margin-left: -1.6em!important;
}

#slider label {
    position: absolute;
    width: 20px;
    margin-left: -10px;
    text-align: center;
    margin-top: 20px;
}

#slider .ui-slider-handle {
  outline: 0;
  background: #c0504d;
  border-radius: 50px;
  top: -.6em;
}

#slider.ui-slider-horizontal {
  top: 1em;
  left: 5%;
  height: .1em;
  width: 90%;
  border: none;
  background: #ccc;
}
<link rel="stylesheet" href="https://code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css">
<script src="https://code.jquery.com/jquery-1.10.2.js"></script>
<script src="https://code.jquery.com/ui/1.11.4/jquery-ui.js"></script>
<script src="https://www.amcharts.com/lib/4/core.js"></script>
<script src="https://www.amcharts.com/lib/4/charts.js"></script>
<script src="https://www.amcharts.com/lib/4/themes/animated.js"></script>

<div id="slider"></div>
<div class="container">
<div style="width: 50%; float: left;" id="chartdiv"></div>
<div style="width: 50%; float: right;" id="chartdiv2"></div>
</div>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多