<!DOCTYPE html> <meta charset="utf-8"> <link href="../src/d3.css" rel="stylesheet" type="text/css"> <style> body { overflow-y:scroll; } text { font: 12px sans-serif; } #chart1 { height: 500px; margin: 10px; min-width: 100px; min-height: 100px; /* Minimum height and width is a good idea to prevent negative SVG dimensions... For example width should be =< margin.left + margin.right + 1, of course 1 pixel for the entire chart would not be very useful, BUT should not have errors */ } </style> <body> <div id="chart1"> </div> <script src="../lib/d3.v2.js"></script> <script src="../nv.d3.js"></script> <script src="../src/tooltip.js"></script> <script src="../src/models/axis.js"></script> <script src="../src/models/discreteBar.js"></script> <script src="../src/models/discreteBarWithAxes.js"></script> <script src="stream_layers.js"></script> <script> historicalBarChart = [ { key: "Cumulative Return", values: [ { "label" : "CDS / Options" , "value" : -29.765957771107 } , { "label" : "Cash" , "value" : 0 } , { "label" : "Corporate Bonds" , "value" : 32.807804682612 } , { "label" : "Equity" , "value" : 196.45946739256 } , { "label" : "Index Futures" , "value" : 0.19434030906893 } , { "label" : "Options" , "value" : -98.079782601442 } , { "label" : "Preferred" , "value" : -13.925743130903 } , { "label" : "Not Available" , "value" : -5.1387322875705 } ] } ]; var selector = '#chart1', chart = nv.models.discreteBarWithAxes() .color(d3.scale.category10().range()) .x(function(d) { return d.label }) .y(function(d) { return d.value }), data = historicalBarChart, xTickFormat = function(d) { return d }, yTickFormat = d3.format(',.2f'), xAxisLabel = null, yAxisLabel = null, duration = 500; nv.addGraph({ generate: function() { var container = d3.select(selector), width = function() { return parseInt(container.style('width')) }, height = function() { return parseInt(container.style('height')) }, svg = container.append('svg'); chart .width(width) .height(height) .staggerLabels(true); chart.xAxis .tickFormat(xTickFormat); chart.yAxis .tickFormat(yTickFormat) .axisLabel(yAxisLabel); svg .attr('width', width()) .attr('height', height()) .datum(data) .transition().duration(duration).call(chart); return chart; }, callback: function(chart) { var showTooltip = function(e) { var offsetElement = document.getElementById(selector.substr(1)), left = e.pos[0] + offsetElement.offsetLeft, top = e.pos[1] + offsetElement.offsetTop, formatY = chart.yAxis.tickFormat(), //Assumes using same format as axis, can customize to show higher precision, etc. formatX = chart.xAxis.tickFormat(); // uses the chart's getX and getY, you may customize if x position is not the same as the value you want // ex. daily data without weekends, x is the index, while you want the date var content = '<h3>' + formatX(chart.x()(e.point)) + '</h3>' + '<p>' + formatY(chart.y()(e.point)) + '</p>'; nv.tooltip.show([left, top], content, e.value < 0 ? 'n' : 's'); }; chart.dispatch.on('tooltipShow', showTooltip); chart.dispatch.on('tooltipHide', nv.tooltip.cleanup); window.onresize= function() { // now that width and height are functions, should be automatic..of course you can always override them d3.select('#chart1 svg') .attr('width', chart.width()()) //need to set SVG dimensions, chart is not aware of the SVG component .attr('height', chart.height()()) .transition().duration(duration) .call(chart); /* d3.select('#chart1 svg') .attr('width', chart.width()()) //need to set SVG dimensions, chart is not aware of the SVG component .attr('height', chart.height()()) .call(chart); */ }; } }); </script>