Skip to content

Commit

Permalink
#1889 Correct line chart legend bottom position, to account for botto…
Browse files Browse the repository at this point in the history
…m margin and xAxis
  • Loading branch information
KidA78 committed Dec 10, 2016
1 parent a3993a8 commit 6bd949d
Show file tree
Hide file tree
Showing 2 changed files with 149 additions and 2 deletions.
145 changes: 145 additions & 0 deletions examples/lineChartBottomLegend.html
@@ -0,0 +1,145 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link href="../build/nv.d3.css" rel="stylesheet" type="text/css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.2/d3.min.js" charset="utf-8"></script>
<script src="../build/nv.d3.js"></script>

<style>
text {
font: 12px sans-serif;
}
svg {
display: block;
}
html, body, #chart1, svg {
margin: 0px;
padding: 0px;
height: 100%;
width: 100%;
}

.dashed {
stroke-dasharray: 5,5;
}
</style>
</head>
<body class='with-3d-shadow with-transitions'>
<div style="position:absolute; top: 0; left: 0;">
<button onclick="randomizeFillOpacity();">Randomize fill opacity</button>
<button onclick="expandLegend();">Expand/Contract Legend</button>
<script>
var expandLegend = function() {
var exp = chart.legend.expanded();
chart.legend.expanded(!exp);
chart.update();
}
</script>
</div>
<div id="chart1"></div>

<script>
// Wrapping in nv.addGraph allows for '0 timeout render', stores rendered charts in nv.graphs, and may do more in the future... it's NOT required
var chart;
var data;

var randomizeFillOpacity = function() {
var rand = Math.random(0,1);
for (var i = 0; i < 100; i++) { // modify sine amplitude
data[4].values[i].y = Math.sin(i/(5 + rand)) * .4 * rand - .25;
}
data[4].fillOpacity = rand;
chart.update();
};

nv.addGraph(function() {
chart = nv.models.lineChart().legendPosition("bottom")
.options({
duration: 300,
useInteractiveGuideline: true
})
;

// chart sub-models (ie. xAxis, yAxis, etc) when accessed directly, return themselves, not the parent chart, so need to chain separately
chart.xAxis
.axisLabel("Time (s)")
.tickFormat(d3.format(',.1f'))
.staggerLabels(true)
;

chart.yAxis
.axisLabel('Voltage (v)')
.tickFormat(function(d) {
if (d == null) {
return 'N/A';
}
return d3.format(',.2f')(d);
})
;

data = sinAndCos();

d3.select('#chart1').append('svg')
.datum(data)
.call(chart);

nv.utils.windowResize(chart.update);

return chart;
});

function sinAndCos() {
var sin = [],
sin2 = [],
cos = [],
rand = [],
rand2 = []
;

for (var i = 0; i < 100; i++) {
sin.push({x: i, y: i % 10 == 5 ? null : Math.sin(i/10) }); //the nulls are to show how defined works
sin2.push({x: i, y: Math.sin(i/5) * 0.4 - 0.25});
cos.push({x: i, y: .5 * Math.cos(i/10)});
rand.push({x:i, y: Math.random() / 10});
rand2.push({x: i, y: Math.cos(i/10) + Math.random() / 10 })
}

return [
{
area: true,
values: sin,
key: "Sine Wave",
color: "#ff7f0e",
strokeWidth: 4,
classed: 'dashed'
},
{
values: cos,
key: "Cosine Wave",
color: "#2ca02c"
},
{
values: rand,
key: "Random Points",
color: "#2222ff"
},
{
values: rand2,
key: "Random Cosine",
color: "#667711",
strokeWidth: 3.5
},
{
area: true,
values: sin2,
key: "Fill opacity",
color: "#EF9CFB",
fillOpacity: .1
}
];
}

</script>
</body>
</html>
6 changes: 4 additions & 2 deletions src/models/lineChart.js
Expand Up @@ -160,8 +160,10 @@ nv.models.lineChart = function() {
.call(legend);

if (legendPosition === 'bottom') {
wrap.select('.nv-legendWrap')
.attr('transform', 'translate(0,' + availableHeight +')');
margin.bottom = xAxis.height() + legend.height();
availableHeight = nv.utils.availableHeight(height, container, margin);
g.select('.nv-legendWrap')
.attr('transform', 'translate(0,' + (availableHeight + xAxis.height()) +')');
} else if (legendPosition === 'top') {
if (!marginTop && legend.height() !== margin.top) {
margin.top = legend.height();
Expand Down

0 comments on commit 6bd949d

Please sign in to comment.