
Gráfica con d3
Publicado por Susana (3 intervenciones) el 25/08/2022 16:03:15
Hola, estoy haciendo este ejercicio para un curso que estoy dando. He conseguido hacerlo todo, menos que el alert me muestre las coordenadas, ya que no soy capaz de enlazarlas. El alert si que me funciona, ya que cuando doy click en los puntos, me salta el Por fin!
He probado muchas cosas que se me han ocurrido y he ido buscando, pero nada me funciona. No sé que estoy haciendo mal...
Alguien me puedo ayudar?

Os adjunto el código que tengo hasta ahora:
Además no entiendo muy bien estas últimas líneas:
Este es el código base que nos ha dado el profesor:
He probado muchas cosas que se me han ocurrido y he ido buscando, pero nada me funciona. No sé que estoy haciendo mal...
Alguien me puedo ayudar?

Os adjunto el código que tengo hasta ahora:
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
86
87
88
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1, maximum-scale=1">
</head>
<body>
<div id="graph"></div>
<div id="puntos"></div>
<script src="https://d3js.org/d3.v4.js"></script>
<script>
// Definición de constantes const GRAPH_HEIGHT = 300; const GRAPH_WIDTH = 400; const MARGIN = 30;const DATA = [
{x: 20,
y: 30},
{x: 35,
y: 10},
{x: 70,
y: 38},
{x: 100,
y: 100 } ]const minMax = [0, 100];
const radioCirculo = 5; // Funciones escalares -> Más info: https://d3-spanish.readthedocs.io/es/latest/basico/escalas.htmlconst xScale = d3.scaleLinear()
// Valores mínimos y máximos que se mostrarán en la gráfica.domain(minMax)
// Proyección del valor del dominio en relación al ancho de la gráfica.range([0, GRAPH_WIDTH]);
const yScale = d3.scaleLinear()
.domain(minMax)
.range([GRAPH_HEIGHT, 0]);
// Añadimos la gráfica al elemento del domlet svg = d3.select("#graph")
.append("svg")
.attr("width", GRAPH_WIDTH + MARGIN * 2)
.attr("height", GRAPH_HEIGHT + MARGIN * 2)
.append("g")
.attr("transform", `translate(${MARGIN}, ${MARGIN})`);
// Añadimos las líneas de los ejessvg
.append('g')
.attr("transform", `translate(0, ${GRAPH_HEIGHT})`)
.call(d3.axisBottom(xScale));
svg
.append('g')
.call(d3.axisLeft(yScale));
// Añadimos un punto por cada objeto del array de datossvg
.selectAll("whatever")
.data(DATA)
.enter()
.append("circle")
.style("cursor", "pointer")
.on("click", function() {alert("Por fin!")})
// Se obtienen las coordenadas x e y en relación a los valores del objeto.attr("cx", ({ x }) => xScale(x))
.attr("cy", ({ y }) => yScale(y))
.attr("r", radioCirculo)
</script>
</body>
</html>
Además no entiendo muy bien estas últimas líneas:
1
2
3
4
// Se obtienen las coordenadas x e y en relación a los valores del objeto.attr("cx", ({ x }) => xScale(x))
.attr("cy", ({ y }) => yScale(y))
.attr("r", radioCirculo)
Este es el código base que nos ha dado el profesor:
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
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1, maximum-scale=1">
</head>
<body>
<div id="graph"></div>
<script src="https://d3js.org/d3.v4.js"></script>
<script>
// Definición de constantes const GRAPH_HEIGHT = 300; const GRAPH_WIDTH = 400; const MARGIN = 30;const DATA = [
{x: 1,
y: 3},
{x: 4,
y: 9},
{x: 8,
y: 5},
] // Funciones escalares -> Más info: https://d3-spanish.readthedocs.io/es/latest/basico/escalas.htmlconst xScale = d3.scaleLinear()
// Valores mínimos y máximos que se mostrarán en la gráfica.domain([0, 10])
// Proyección del valor del dominio en relación al ancho de la gráfica.range([0, GRAPH_WIDTH]);
const yScale = d3.scaleLinear()
.domain([0, 10])
.range([GRAPH_HEIGHT, 0]);
// Añadimos la gráfica al elemento del domlet svg = d3.select("#graph")
.append("svg")
.attr("width", GRAPH_WIDTH + MARGIN * 2)
.attr("height", GRAPH_HEIGHT + MARGIN * 2)
.append("g")
.attr("transform", `translate(${MARGIN}, ${MARGIN})`);
// Añadimos las líneas de los ejessvg
.append('g')
.attr("transform", `translate(0, ${GRAPH_HEIGHT})`)
.call(d3.axisBottom(xScale));
svg
.append('g')
.call(d3.axisLeft(yScale));
// Añadimos un punto por cada objeto del array de datossvg
.selectAll("whatever")
.data(DATA)
.enter()
.append("circle")
// Se obtienen las coordenadas x e y en relación a los valores del objeto.attr("cx", ({ x }) => xScale(x))
.attr("cy", ({ y }) => yScale(y))
.attr("r", 3)
</script>
</body>
</html>
Valora esta pregunta


0

