
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.html
const 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 dom
let 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 ejes
svg
.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 datos
svg
.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.html
const 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 dom
let 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 ejes
svg
.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 datos
svg
.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