Public
Edited
Apr 26, 2023
1 fork
1 star
Insert cell
Insert cell
coleccion_de_circulos = [
{"eje_x":50 , "eje_y":45, "radio":22, "color":"#ffbe0b"},
{"eje_x":40, "eje_y":125, "radio":32, "color":"#fb5607"},
{"eje_x":180, "eje_y":155, "radio":43, "color":"#ff006e"},
{"eje_x":160, "eje_y":50, "radio":32, "color":"#8338ec"},
{"eje_x":110, "eje_y":100, "radio":22, "color":"#3a86ff" }
];
Insert cell
Insert cell
{
// 1. Creación de un área de dibujo
const svg = d3.create("svg")
.attr("width",width)
.attr("height",height);
// 2. Asociamos la colección de círculos a componentes gráficos "circle"
var circulos = svg.selectAll("circle")
.data(coleccion_de_circulos)
.enter()
.append("circle");

// 3. Le decimos a d3 cómo utilizar la información disponible en el arreglo
// para setear las propiedades cx, cy, r y fill del componente HTML circle
circulos.attr("cx", function(d) {return d.eje_x;} )
.attr("cy", function(d) {return d.eje_y;} )
.attr("r" , function(d) {return d.radio;} )
.style("fill", function(d) { return d.color;})
// Tenemos que definir 3 funciones para poder hacer efectivo el drag-and-drop
// d3 se encarga de asociar estas funciones internamente a cada componente
.call(d3.drag()
.on("start", dragstarted)
.on("drag", dragged)
.on("end", dragended))
// 4. Retornamos el canvas
return svg.node();
}
Insert cell
Insert cell
// Acción al iniciar el drag, en este caso, cambiar el color y el ancho del borde del círculo
// .rise() tra el elemento al frente. Prueben qué ocurre si eliminan el .rise()
function dragstarted(d) {
d3.select(this).raise().attr("stroke", "#FFFFFF").attr("stroke-width",3).attr("stroke-dasharray",4);
}
Insert cell
// Acción durante el drag, en este caso, cambiar la posición del círculo. Noten que estamos cambiando el arreglo de datos con la información proveniente del evento del mouse d3.event.x / d3.event.y
function dragged(d) {
d3.select(this).attr("cx", d.eje_x = d3.event.x).attr("cy", d.eje_y = d3.event.y);
}
Insert cell
// Acción al finalizar el drag, en este caso, borrar la línea punteada que creamos alrededor del círculo para indicar al usuario que tenía el control sobre su posición
function dragended(d) {
d3.select(this).attr("stroke", null);
}
Insert cell
Insert cell
{
// 1. Creación de un área de dibujo
const svg = d3.create("svg")
.attr("width",width)
.attr("height",height);
// 2. Asociamos la colección de círculos a componentes gráficos "circle"
var circulos = svg.selectAll("circle")
.data(coleccion_de_circulos)
.enter()
.append("circle");
// 3. Le decimos al área de dibujo que queremos poder hacer zoom con los círculos.
// d3.zoom() facilita la tarea de agregar esta funcionalidad:
svg.call(d3.zoom()
.extent([[0, 0], [width, height]]) // El área zoomeable
.scaleExtent([1, 8]) // Minimo y máximo factor de escala posible
.on("zoom", function() {
circulos.attr("transform", d3.event.transform); // d3.event contiene la información del evento actual y el .transform aplica la transformación: al punto (x,y) le aplica la escala seleccionada
}));

// 4. Le decimos a d3 cómo utilizar la información disponible en el arreglo
// para setear las propiedades cx, cy, r y fill del componente HTML circle
circulos.attr("cx", function(d) {return d.eje_x;} )
.attr("cy", function(d) {return d.eje_y;} )
.attr("r" , function(d) {return d.radio;} )
.style("fill", function(d) { return d.color;})
// Tenemos que definir 3 funciones para poder hacer efectivo el drag-and-drop
// d3 se encarga de asociar estas funciones internamente a cada componente
.call(d3.drag()
.on("start", dragstarted)
.on("drag", dragged)
.on("end", dragended))
// 5. Retornamos el canvas
return svg.node();
}
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more