【问题标题】:Display Pie chart, Grouped and Stacked bar chart in one page在一页中显示饼图、分组和堆叠条形图
【发布时间】:2014-08-24 06:52:45
【问题描述】:

我想在一页中显示两个图表。饼图已显示,但未显示分组和堆叠条形图。我尝试更改 Id 名称,但没有运气:(。如果有人帮助我进行代码更正,将不胜感激。

/* 在一页显示矩阵图、饼图、分组和堆叠条形图 */

<apex:page showHeader="false">

    <apex:includeScript value="{!URLFOR($Resource.jquery1)}"/>    
    <apex:includeScript value="{!URLFOR($Resource.D3)}"/>
    <apex:includeScript value="{!URLFOR($Resource.nvD3)}"/> 

  <div id="body"  height="50%" width="100px" ></div>  // Id for Pie chart
  <div id="body1" height="30%" width="90px"></div>  // Id for Stacked and Grouped bar chart

<script>

// Matrix Chart starts here 
  var drawChart = function(divId,matrixReportId) {

        $.ajax('/services/data/v29.0/analytics/reports/'+matrixReportId,
            {
                    beforeSend: function(xhr) {
                    xhr.setRequestHeader('Authorization', 'Bearer {!$Api.Session_ID}');
                },

                success: function(response) {
                    console.log(response);

                 var chart = nv.models.multiBarChart();
                    var chartData = [];

                    document.getElementById(divId).innerHTML = '';

                    $.each(response.groupingsDown.groupings, function(di, de) {
                        var values = [];
                        chartData.push({"key":de.label, "values": values});
                        $.each(response.groupingsAcross.groupings, function(ai, ae) {
                            values.push({"x": ae.label, "y": response.factMap[de.key+"!"+ae.key].aggregates[0].value});
                        });
                    });
                    d3.select('#'+divId).datum(chartData).transition().duration(100).call(chart);
                    window.setTimeout(function(){ 
                        drawChart(divId,matrixReportId);
                    }, 5000);
                }
            }
        );
 };
 $(document).ready(function(){ 
   drawChart('chart','00O90000005SSHv');
 });

 //  Pie Chart Starts here

   var width =250 ,
    height = 450,
    radius = Math.min(width, height) / 2;

    var data = [{"age":"<5","population":2704659},{"age":"14-17","population":2159981},
        {"age":"14-17","population":2159981},{"age":"18-24","population":3853788},
        {"age":"25-44","population":14106543},{"age":"45-64","population":8819342},
        {"age":">65","population":612463}];

    var color = d3.scale.ordinal()
        .range(["#98abc5", "#8a89a6", "#7b6888", "#6b486b", "#a05d56", "#d0743c", "#ff8c00"]);

     var arc = d3.svg.arc().outerRadius(radius - 10).innerRadius(0);

    var pie = d3.layout.pie()
        .sort(null)
        .value(function(d) { return d.population; });

    var svg = d3.select("#body").append("svg")
        .attr("width", width)
        .attr("height", height)
        .append("g")
        .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");


      var g = svg.selectAll(".arc")
          .data(pie(data))
        .enter().append("g")
          .attr("class", "arc");

      g.append("path")
          .attr("d", arc)
          .style("fill", function(d) { return color(d.data.age); });

      g.append("text")
          .attr("transform", function(d) { return "translate(" + arc.centroid(d) + ")"; })
          .attr("dy", ".35em")
          .style("text-anchor", "middle")
          .text(function(d) { return d.data.age; });


 //  Grouped and Stacked Bar Chart starts here

     var n = 2, // number of layers
        m = 10, // number of samples per layer
        stack = d3.layout.stack(),
        layers = stack(d3.range(n).map(function() { return bumpLayer(m, .1); })),
        yGroupMax = d3.max(layers, function(layer) { return d3.max(layer, function(d) { return d.y; }); }),
        yStackMax = d3.max(layers, function(layer) { return d3.max(layer, function(d) { return d.y0 + d.y; }); });

     var margin = {top: 40, right: 10, bottom: 20, left: 10},
        width = 960 - margin.left - margin.right,
        height = 500 - margin.top - margin.bottom;

     var x = d3.scale.ordinal()
        .domain(d3.range(m))
        .rangeRoundBands([0, width], .08);

    var y = d3.scale.linear()
        .domain([0, yStackMax])
        .range([height, 0]);

    var color = d3.scale.linear()
        .domain([0, n - 1])
        .range(["#aad", "#556"]);

    var xAxis = d3.svg.axis()
        .scale(x)
        .tickSize(0)
        .tickPadding(6)
        .orient("bottom");

    var svg = d3.select("#body").append("svg")
        .attr("width", width + margin.left + margin.right)
        .attr("height", height + margin.top + margin.bottom)
      .append("g")
        .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

    var layer = svg.selectAll(".layer")
        .data(layers)
      .enter().append("g")
        .attr("class", "layer")
        .style("fill", function(d, i) { return color(i); });

    var rect = layer.selectAll("rect")
        .data(function(d) { return d; })
      .enter().append("rect")
        .attr("x", function(d) { return x(d.x); })
        .attr("y", height)
        .attr("width", x.rangeBand())
        .attr("height", 0);

    rect.transition()
        .delay(function(d, i) { return i * 10; })
        .attr("y", function(d) { return y(d.y0 + d.y); })
        .attr("height", function(d) { return y(d.y0) - y(d.y0 + d.y); });

    svg.append("g")
        .attr("class", "x axis")
        .attr("transform", "translate(0," + height + ")")
        .call(xAxis);

    d3.selectAll("input").on("change", change);

    var timeout = setTimeout(function() {
      d3.select("input[value=\"grouped\"]").property("checked", true).each(change);
    }, 2000);

    function change() {
      clearTimeout(timeout);
      if (this.value === "grouped") transitionGrouped();
      else transitionStacked();
    }

    function transitionGrouped() {
      y.domain([0, yGroupMax]);

      rect.transition()
          .duration(500)
          .delay(function(d, i) { return i * 10; })
          .attr("x", function(d, i, j) { return x(d.x) + x.rangeBand() / n * j; })
          .attr("width", x.rangeBand() / n)
        .transition()
          .attr("y", function(d) { return y(d.y); })
          .attr("height", function(d) { return height - y(d.y); });
    }

    function transitionStacked() {
      y.domain([0, yStackMax]);

      rect.transition()
          .duration(500)
          .delay(function(d, i) { return i * 10; })
          .attr("y", function(d) { return y(d.y0 + d.y); })
          .attr("height", function(d) { return y(d.y0) - y(d.y0 + d.y); })
        .transition()
          .attr("x", function(d) { return x(d.x); })
          .attr("width", x.rangeBand());
    }

    // Inspired by Lee Byron's test data generator.
    function bumpLayer(n, o) {

      function bump(a) {
        var x = 1/(.1 + Math.random()),
            y = 2*Math.random()-.5,
            z = 10/(.1 + Math.random());
        for (var i = 0; i < n; i++) {
          var w = (i/n- y) * z;
          a[i] += x * Math.exp(-w * w);
        }
      }

      var a=[],i;
      for (i = 0; i < n; ++i) a[i] = o + o * Math.random();
      for (i = 0; i < 5; ++i) bump(a);
      return a.map(function(d, i) { return {x: i, y: Math.max(0, d)}; });
    }
    </script>
 <svg id="chart" height="50%" width="500px" ></svg>  // Id for Matrix chart
</apex:page>
Thanks in advance 

【问题讨论】:

    标签: javascript d3.js charts


    【解决方案1】:

    首先,正如我们在此处讨论的 (d3 Donut chart does not render),您应该定位您的

     <div id="body1" height="30%" width="90px"></div>
    

    在脚本之上。

    其次,您在第二个 svg-declaration 中缺少 # 以通过其 id 正确选择 div,它必须是

     var svg = d3.select("#body1").append("svg")
    

    您还可以考虑以不同的方式命名第二个 svg(例如 svg2),这样您就不会覆盖您的第一个 svg 变量(以防您以后想对它做一些事情)。

    【讨论】:

    • 赫伯特,这很有用。但是,我现在正在尝试的是第一行的堆叠和条形图,然后是第二行 - 饼图和矩阵图。但令我惊讶的是,他们都在单独的 rows/divs 中显示它。编辑了我的代码。所以这个显示是 - 首先是饼图,其次是堆叠和分组条形图,最后是矩阵图。任何指针?
    • 嗯,不确定我是否理解正确,但这听起来有点像定位问题?如果是这样的话,你能相应地安排你的div吗?通常完成定位的一种方法是创建一个容器 div,然后将具有相应 id 的其他 div 放入此容器中,使用 css 来排列它们。另外,在您的代码中,据我所知,您现在选择了两次相同的 div,一次用于饼图,一次用于条形图(两次 #body 而不是 #body1)。
    • 是的,它是关于定位图表的。我尝试用 div 调整它,但到目前为止没有运气。所以第一行是第一行的质押和分组图表。第二行 - 两个图表,一个是饼图,第二个是矩阵图。尝试使用 CSS,但它们是重叠的。任何带有代码的建议都是最好的。谢谢
    • 好的,我把它放在一个小提琴里:jsfiddle.net/99nuL - 也许它有助于玩一点 css。我认为您应该使用没有高度/宽度的 div,因为附加的 svg 大于您定义的边界。如果有的话,这些值应该匹配。没有绘制矩阵图,但这可能是由于 ajax 请求。希望这会有所帮助。
    • 对不起赫伯特,正在休假。我非常感谢你。这确实增加了我的见识。它是宾果游戏!
    猜你喜欢
    • 2020-10-05
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多