Skip to content

Instantly share code, notes, and snippets.

@phuquoc
Last active January 17, 2019 13:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save phuquoc/33172b04800f40ee4c7de5f80ba13440 to your computer and use it in GitHub Desktop.
Save phuquoc/33172b04800f40ee4c7de5f80ba13440 to your computer and use it in GitHub Desktop.
depended slider
license: mit
d3.button = function() {
var dispatch = d3.dispatch('press', 'release');
var padding = 10,
radius = 10,
stdDeviation = 5,
offsetX = 2,
offsetY = 4;
function my(selection) {
selection.each(function(d, i) {
var g = d3.select(this)
.attr('id', 'd3-button' + i)
.attr('transform', 'translate(' + d.x + ',' + d.y + ')');
var text = g.append('text').text(d.label);
var defs = g.append('defs');
var bbox = text.node().getBBox();
var rect = g.insert('rect', 'text')
.attr("x", bbox.x - padding)
.attr("y", bbox.y - padding)
.attr("width", bbox.width + 2 * padding)
.attr("height", bbox.height + 2 * padding)
.attr('rx', radius)
.attr('ry', radius)
.on('mouseover', activate)
.on('mouseout', deactivate)
.on('click', toggle)
addShadow.call(g.node(), d, i);
addGradient.call(g.node(), d, i);
});
}
function addGradient(d, i) {
var defs = d3.select(this).select('defs');
var gradient = defs.append('linearGradient')
.attr('id', 'gradient' + i)
.attr('x1', '0%')
.attr('y1', '0%')
.attr('x2', '0%')
.attr('y2', '100%');
gradient.append('stop')
.attr('id', 'gradient-start')
.attr('offset', '0%')
gradient.append('stop')
.attr('id', 'gradient-stop')
.attr('offset', '100%')
d3.select(this).select('rect').attr('fill', 'url(#gradient' + i + ")" );
}
function addShadow(d, i) {
var defs = d3.select(this).select('defs');
var rect = d3.select(this).select('rect').attr('filter', 'url(#dropShadow' + i + ")" );
var shadow = defs.append('filter')
.attr('id', 'dropShadow' + i)
.attr('x', rect.attr('x'))
.attr('y', rect.attr('y'))
.attr('width', rect.attr('width') + offsetX)
.attr('height', rect.attr('height') + offsetY)
shadow.append('feGaussianBlur')
.attr('in', 'SourceAlpha')
.attr('stdDeviation', 2)
shadow.append('feOffset')
.attr('dx', offsetX)
.attr('dy', offsetY);
var merge = shadow.append('feMerge');
merge.append('feMergeNode');
merge.append('feMergeNode').attr('in', 'SourceGraphic');
}
function activate() {
var gradient = d3.select(this.parentNode).select('linearGradient')
d3.select(this.parentNode).select("rect").classed('active', true)
if (!gradient.node()) return;
gradient.select('#gradient-start').classed('active', true)
gradient.select('#gradient-stop').classed('active', true)
}
function deactivate() {
var gradient = d3.select(this.parentNode).select('linearGradient')
d3.select(this.parentNode).select("rect").classed('active', false)
if (!gradient.node()) return;
gradient.select('#gradient-start').classed('active', false);
gradient.select('#gradient-stop').classed('active', false);
}
function toggle(d, i) {
if (d3.select(this).classed('pressed')) {
release.call(this, d, i);
deactivate.call(this, d, i);
} else {
press.call(this, d, i);
activate.call(this, d, i);
}
}
function press(d, i) {
dispatch.call('press', this, d, i)
d3.select(this).classed('pressed', true);
var shadow = d3.select(this.parentNode).select('filter')
if (!shadow.node()) return;
shadow.select('feOffset').attr('dx', 0).attr('dy', 0);
shadow.select('feGaussianBlur').attr('stdDeviation', 0);
}
function release(d, i) {
dispatch.call('release', this, d, i)
my.clear.call(this, d, i);
}
my.clear = function(d, i) {
d3.select(this).classed('pressed', false);
var shadow = d3.select(this.parentNode).select('filter')
if (!shadow.node()) return;
shadow.select('feOffset').attr('dx', offsetX).attr('dy', offsetY);
shadow.select('feGaussianBlur').attr('stdDeviation', stdDeviation);
}
my.on = function() {
var value = dispatch.on.apply(dispatch, arguments);
return value === dispatch ? my : value;
};
return my;
}
letter frequency
A .08167
B .01492
C .02782
D .04253
E .12702
F .02288
G .02015
H .06094
I .06966
J .00153
K .00772
L .04025
M .02406
N .06749
O .07507
P .01929
Q .00095
R .05987
S .06327
T .09056
U .02758
V .00978
W .02360
X .00150
Y .01974
Z .00074
<!DOCTYPE html>
<meta charset="utf-8">
<style>
text {
font-family: sans-serif;
}
.bar {
fill: cornflowerblue;
}
.bar:hover {
fill: pink;
}
.axis--x path {
display: none;
}
</style>
<svg width="100%" height="500px"></svg>
<script src="https://d3js.org/d3.v4.min.js"></script>
<script>
// SETUP
var svg = d3.select("svg"),
margin = { top: 20, right: 20, bottom: 30, left: 40 },
x = d3.scaleBand().padding(0.1),
y = d3.scaleLinear(),
theData = undefined;
var g = svg.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
g.append("g")
.attr("class", "axis axis--x");
g.append("g")
.attr("class", "axis axis--y");
g.append("text")
.attr("transform", "rotate(-90)")
.attr("y", 6)
.attr("dy", "0.71em")
.attr("text-anchor", "end")
.text("Frequency");
// DRAWING
function draw() {
var bounds = svg.node().getBoundingClientRect(),
width = bounds.width - margin.left - margin.right,
height = bounds.height - margin.top - margin.bottom;
console.log("BBBB", width)
x.rangeRound([0, width]);
y.rangeRound([height, 0]);
g.select(".axis--x")
.attr("transform", "translate(0," + height + ")")
.call(d3.axisBottom(x));
g.select(".axis--y")
.call(d3.axisLeft(y).ticks(10, "%"));
var bars = g.selectAll(".bar")
.data(theData);
// ENTER
bars
.enter().append("rect")
.attr("class", "bar")
.attr("x", function (d) { return x(d.letter); })
.attr("y", function (d) { return y(d.frequency); })
.attr("width", function(d) { return x.bandwidth();})
.attr("height", function (d) { return height - y(d.frequency); });
console.log("XXXXXXXXX", x.bandwidth())
// UPDATE
bars.attr("x", function (d) { return x(d.letter); })
.attr("y", function (d) { return y(d.frequency); })
.attr("width", function(d) { return x.bandwidth();})
.attr("height", function (d) { return height - y(d.frequency); });
// EXIT
bars.exit()
.remove();
}
// LOADING DATA
function loadData(tsvFile) {
d3.tsv(tsvFile, function (d) {
d.frequency = +d.frequency;
return d;
}, function (error, data) {
if (error) throw error;
theData = data;
x.domain(theData.map(function (d) { return d.letter; }));
y.domain([0, d3.max(theData, function (d) { return d.frequency; })]);
draw();
});
}
// START!
window.addEventListener("resize", draw);
loadData("data.tsv");
</script>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment