/
graph.js
86 lines (68 loc) · 1.88 KB
/
graph.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
var width = 1920
var height = 1080
var k = height/width
x = d3.scaleLinear()
.domain(data.map(d => d[1]))
.range([0, width])
y = d3.scaleLinear()
.domain(data.map(d => d[2]))
.range([height, 0])
z = d3.scaleOrdinal()
.domain(data.map(d => d[3]))
.range(d3.schemeCategory10)
const zoom = d3.zoom()
.scaleExtent([0.5, 64])
.on("zoom", zoomed);
const svg = d3.select("svg")
.attr("viewBox", [0, 0, width, height]);
const gDot = svg.append("g")
.attr("fill", "none")
var gdata = gDot.selectAll("path")
.data(data)
function click(event) {
var dt = event.srcElement.__data__
var pid = dt[0]
var title = dt[4]
var istag = dt[6]
if (istag) {
var url = "https://astronomy.stackexchange.com/questions/tagged/"+title
} else {
var url = "https://astronomy.stackexchange.com/questions/"+pid
}
window.open(url,'_blank');
}
/*
gdata.enter()
.append("circle")
.attr("cx", d => x(d[1]))
.attr("cy", d => y(d[2]))
.attr("r", d => 1)//Math.log(d[3]+2)/5)
.attr("stroke", "black")
.attr("stroke-width", 0.01)
.attr("fill", d => d[5] ? "green" : "white")
.on("click", click)
*/
gdata.enter()
.append("text")
.attr("dx", d => x(d[1]))
.attr("dy", d => y(d[2]))
.text(d => d[4])
.attr("fill", d => d[5] ? d[6] ? "blue" : "green" : "black")
.attr("font-size", d => d[6] ? 8 : Math.log(Math.max(d[7], 0) + 10))
.on("click", click)
//.attr("pointer-events", "none")
const gx = svg.append("g");
const gy = svg.append("g");
svg.call(zoom).call(zoom.transform, d3.zoomIdentity);
function zoomed({transform}) {
const zx = transform.rescaleX(x).interpolate(d3.interpolateRound);
const zy = transform.rescaleY(y).interpolate(d3.interpolateRound);
gDot.attr("transform", transform).attr("r", 1 / transform.k);
}
var chart = Object.assign(svg.node(), {
reset() {
svg.transition()
.duration(750)
.call(zoom.transform, d3.zoomIdentity);
}
});