D3.Js条形图问题

时间:2015-04-16 07:32:33

标签: d3.js

我正在尝试使用D3.js绘制条形图但不成功。 我正在尝试如下

Model.cs     公共课BarChart     {         public DateTime TaskDate {get;组; }         public float Duration {get;组; }     }

Index.cshtml 在我的Index.cshtml(razor语法,mvc视图) 我有以下代码来绘制条形图

<head>
    <meta name="viewport" content="width=device-width" />
    <title> Report</title>
    <script type="text/javascript" src="/Scripts/d3.js"></script>
    <script type="text/javascript" src="https:/Scripts/d3pie.js"></script>
    <script type="text/javascript" src="https:/Scripts/d3.tip.v0.6.3.js"></script>
    .axis path, .axis line
    {
    fill: none;
    stroke: #777;
    shape-rendering: crispEdges;
    }

    .axis text
    {
    font-family: 'Arial';
    font-size: 13px;
    }
    .tick
    {
    stroke-dasharray: 1, 2;
    }
    .bar
    {
    fill: FireBrick;
    }
</head>

条形图java脚本

<svg id="visualisation" width="1000" height="500"></svg>

<script>
    var jsonData  = @Html.Raw(Json.Encode(Model.BarChart));


    data = jsonData;

    InitChart();

    function InitChart() {

        var barData = data;

        var vis = d3.select('#visualisation'),
          WIDTH = 1000,
          HEIGHT = 500,
          MARGINS = {
              top: 20,
              right: 20,
              bottom: 20,
              left: 50
          },
          xRange = d3.scale.ordinal().rangeRoundBands([MARGINS.left, WIDTH - MARGINS.right], 0.1).domain(barData.map(function (d) {
              return d.Date;
          })),


          yRange = d3.scale.linear().range([HEIGHT - MARGINS.top, MARGINS.bottom]).domain([0,
            d3.max(barData, function (d) {
                return d.Duration;
            })
          ]),

          xAxis = d3.svg.axis()
            .scale(xRange)
            .tickSize(5)
            .tickSubdivide(true),

          yAxis = d3.svg.axis()
            .scale(yRange)
            .tickSize(5)
            .orient("left")
            .tickSubdivide(true);


        vis.append('svg:g')
          .attr('class', 'x axis')
          .attr('transform', 'translate(0,' + (HEIGHT - MARGINS.bottom) + ')')
          .call(xAxis);

        vis.append('svg:g')
          .attr('class', 'y axis')
          .attr('transform', 'translate(' + (MARGINS.left) + ',0)')
          .call(yAxis);

        vis.selectAll('rect')
          .data(barData)
          .enter()
          .append('rect')
          .attr('x', function (d) {
              return xRange(d.Date);
          })
          .attr('y', function (d) {
              return yRange(d.Duration);
          })
          .attr('width', xRange.rangeBand())
          .attr('height', function (d) {
              return ((HEIGHT - MARGINS.bottom) - yRange(d.Duration));
          })
          .attr('fill', 'grey')
          .on('mouseover', function (d) {
              d3.select(this)
                .attr('fill', 'blue');
          })
          .on('mouseout', function (d) {
              d3.select(this)
                .attr('fill', 'grey');
          });

    }
</script>

我在控制台中收到错误

Error: Invalid value for <rect> attribute height="NaN"
Error: Invalid value for <rect> attribute y="NaN"

1 个答案:

答案 0 :(得分:0)

这是猜测。

尝试将所有d.y更改为d.duration(或d.Duration),并将模型设为值数组。

您的d3代码基于data又名barData又名jsonData是数组的想法。在您当前的代码中并非如此。

http://plnkr.co/edit/Koz58SZJ1C9hS2rDmBSj?p=preview