Built with blockbuilder.org
forked from Micromegass's block: fresh block
license: mit |
Built with blockbuilder.org
forked from Micromegass's block: fresh block
<!DOCTYPE html> | |
<head> | |
<meta charset="utf-8"> | |
<script src="https://d3js.org/d3.v5.min.js"></script> | |
<style> | |
body { margin:0;position:fixed;top:0;right:0;bottom:0;left:0; } | |
.area-heat-cool { | |
width: 960px; | |
height: 500px; | |
position: relative; | |
} | |
svg { | |
width: 100%; | |
height: 100%; | |
position: center; | |
} | |
path.slice{ | |
stroke-width:2px; | |
} | |
polyline{ | |
opacity: .3; | |
stroke: black; | |
stroke-width: 2px; | |
fill: none; | |
} | |
.toolTip { | |
position: absolute; | |
display: none; | |
width: auto; | |
height: auto; | |
background: none repeat scroll 0 0 white; | |
border: 0 none; | |
border-radius: 8px 8px 8px 8px; | |
box-shadow: -3px 3px 15px #888888; | |
color: black; | |
font: 12px sans-serif; | |
padding: 5px; | |
text-align: center; | |
} | |
.legend { | |
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; | |
font-size: 60%; | |
} | |
rect { | |
stroke-width: 2; | |
} | |
text { | |
font: 10px sans-serif; | |
fill: black; | |
} | |
text.value{ | |
font-size: 200%; | |
fill: white; | |
} | |
text.label{ | |
font-size: 100%; | |
} | |
.axis text { | |
font: 10px sans-serif; | |
} | |
.axis path{ | |
fill: none; | |
stroke: #000; | |
} | |
.axis line { | |
fill: none; | |
stroke: #000; | |
shape-rendering: crispEdges; | |
} | |
.axis .tick line { | |
stroke-width: 1; | |
stroke: rgba(0, 0, 0, 0.2); | |
} | |
.axisHorizontal path{ | |
fill: none; | |
} | |
.axisHorizontal line { | |
fill: none; | |
stroke: #000; | |
shape-rendering: crispEdges; | |
} | |
.axisHorizontal .tick line { | |
stroke-width: 1; | |
stroke: rgba(0, 0, 0, 0.2); | |
} | |
.bar { | |
fill: #A12D24; | |
fill-opacity: .9; | |
} | |
.x.axis path { | |
display: none; | |
} | |
</style> | |
</head> | |
<body> | |
<div class="area-heat-cool"> | |
<form> | |
<label><input type="radio" name="dataset" id="dataset" value="heat" checked> Text 3</label> | |
<label><input type="radio" name="dataset" id="dataset" value="cool"> Text 1</label> | |
<label><input type="radio" name="dataset" id="dataset" value="area"> Text 2 </label> | |
</form> | |
</div> | |
<script> | |
let datasetTotal = [{label: "example 1", value: 156}, | |
{label: "example 2", value: 189}, | |
{label: "example 3", value: 234}, | |
{label: "example 4", value: 345}, | |
{label: "example 5", value: 346}, | |
{label: "example 6", value: 456}, | |
{label: "example 7", value: 489}, | |
{label: "example 8", value: 567}]; | |
let datasetOption1 = [{label: "example 1", value: 23}, | |
{label: "example 2", value: 211}, | |
{label: "example 3", value: 45}, | |
{label: "example 4", value: 64}, | |
{label: "example 5", value: 95}, | |
{label: "example 6", value: 32}, | |
{label: "example 7", value: 0}, | |
{label: "example 8", value: 234}]; | |
let datasetOption2 = [{label: "example 1", value: 33}, | |
{label: "example 2", value: 211}, | |
{label: "example 3", value: 45}, | |
{label: "example 4", value: 62}, | |
{label: "example 5", value: 15}, | |
{label: "example 6", value: 32}, | |
{label: "example 7", value: 0}, | |
{label: "example 8", value: 234}]; | |
d3.selectAll("input").on("change", function(d) { | |
selectDataset.call(this, d); | |
}); | |
function selectDataset(d) { | |
let value = this.value; | |
if (value === "cool") { | |
change(datasetOption1, value, "Kältebedarf in K"); | |
} else if (value === "area") { | |
change(datasetOption2, value, "Nutzfläche in m3"); | |
} else { | |
change(datasetTotal, value, "Wärmebedarf in K"); | |
} | |
} | |
var margin = { | |
top: (parseInt(d3.select('.area-heat-cool').style('height'), 10) / 20), | |
right: (parseInt(d3.select('.area-heat-cool').style('width'), 10) / 20), | |
bottom: (parseInt(d3.select('.area-heat-cool').style('height'), 10) / 20), | |
left: (parseInt(d3.select('.area-heat-cool').style('width'), 10) / 5) | |
}, | |
width = parseInt(d3.select('.area-heat-cool').style('width'), 10) - margin.left - margin.right, | |
height = parseInt(d3.select('.area-heat-cool').style('height'), 10) - margin.top - margin.bottom; | |
var div = d3.select(".area-heat-cool").append("div").attr("class", "toolTip"); | |
var y = d3.scaleBand() | |
.rangeRound([height, 0], .2, 0.5) | |
.paddingInner(0.1); | |
var x = d3.scaleLinear() | |
.range([0, width]); | |
var xAxis = d3.axisBottom() | |
.scale(x); | |
var yAxis = d3.axisLeft() | |
.scale(y); | |
var svg = d3.select(".area-heat-cool").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 + ")"); | |
svg.append("g") | |
.attr("class", "x axis") | |
.attr("transform", "translate(0," + height + ")") | |
.call(xAxis); | |
//x-axis | |
svg.append("text") | |
.attr("class", "x label") | |
.attr("text-anchor", "end") | |
.attr("x", width) | |
.attr("y", height - 6) | |
.text("Wärmebedarf in K"); | |
//y-axis | |
svg.append("text") | |
.attr("class", "y label") | |
.attr("text-anchor", "end") | |
.attr("y", -20) | |
.attr("dy", ".75em") | |
.attr("transform", "rotate(0)") | |
.text("Gebäude"); | |
d3.select("input[value=\"heat\"]").property("checked", true); | |
change(datasetTotal, undefined, "Wärmebedarf in K"); | |
function change(dataset, optionSelect, textselect) { | |
y.domain(dataset.map(function(d) { | |
return d.label; | |
})); | |
x.domain([0, d3.max(dataset, function(d) { | |
return d.value; | |
})]); | |
svg.select(".y.axis").remove(); | |
svg.select(".x.axis").remove(); | |
d3.select(".x.label").text(textselect).transition().duration(1000) ; | |
svg.append("g") | |
.attr("class", "x axis") | |
.attr("transform", "translate(0," + height + ")") | |
.call(xAxis); | |
svg.append("g") | |
.attr("class", "y axis") | |
.call(yAxis) | |
.append("text") | |
.attr("transform", "rotate(0)") | |
.attr("x", 50) | |
.attr("dx", ".1em") | |
.style("text-anchor", "end") | |
var bar = svg.selectAll(".bar") | |
.data(dataset, function(d) { | |
return d.label; | |
}); | |
var barExit = bar.exit().remove(); | |
var barEnter = bar.enter() | |
.append("g") | |
.attr("class", "bar"); | |
var barRects = barEnter.append("rect") | |
.attr("x", function(d) { | |
return x(0); | |
}) | |
.attr("y", function(d) { | |
return y(d.label); | |
}) | |
.attr("width", function(d) { | |
return x(d.value); | |
}) | |
.attr("height", y.bandwidth()); | |
var barTexts = barEnter.append("text") | |
.attr("x", function(d) { | |
return x(d.value) + 10; | |
}) | |
.attr("y", function(d) { | |
return y(d.label) + y.bandwidth() / 2; | |
}) | |
.attr("dy", ".35em") | |
.text(function(d) { | |
return d.value; | |
}); | |
barRectUpdate = bar.select("rect") | |
.transition() | |
.duration(3050) | |
.attr("x", function(d) { | |
return x(0); | |
}) | |
.attr("y", function(d) { | |
return y(d.label); | |
}) | |
.attr("width", function(d) { | |
return x(d.value); | |
}) | |
.attr("height", y.bandwidth()) | |
.style('fill', function () { | |
if (optionSelect === "heat") { | |
return '#A12D24' | |
} else if (optionSelect === "cool") { | |
return '#668BA4' | |
} else if (optionSelect === "area") { | |
return 'lightgrey' | |
} | |
}); | |
var barTextsUpdate = bar.select("text") | |
.transition() | |
.duration(3050) | |
.attr("x", function(d) { | |
return x(d.value) + 10; | |
}) | |
.attr("y", function(d) { | |
return y(d.label) + y.bandwidth() / 2; | |
}) | |
.attr("dy", ".35em") | |
.text(function(d) { | |
return d.value; | |
}); | |
} | |
</script> | |
</body> |