我正在尝试使用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"
答案 0 :(得分:0)
这是猜测。
尝试将所有d.y
更改为d.duration
(或d.Duration
),并将模型设为值数组。
您的d3代码基于data
又名barData
又名jsonData
是数组的想法。在您当前的代码中并非如此。