El elemento de grupo no comienza en 0,0 dentro del SVG.
Estoy probando d3.js con svelte, y comencé a hacer un gráfico de barras simple, pero me enfrenté a un problema que no pude resolver. El problema es que el elemento de grupo g
dentro del elemento svg
, que contiene las barras, se desplaza inicialmente desde el origen del elemento svg
(la esquina superior izquierda). Este es el código.
<script>
import * as d3 from 'd3';
let data = [
{ name: 'Manzana', amount: 20 },
{ name: 'Naranja', amount: 80 },
{ name: 'Plátano', amount: 50 },
{ name: 'Uvas', amount: 10 },
];
let width = 600;
let height = 400;
let margins = { top: 20, right: 20, bottom: 100, left: 100 };
let innerWidth = width - margins.left - margins.right;
let innerHeight = height - margins.top - margins.bottom;
const xScale = d3
.scaleBand()
.domain(data.map((d) => d.name))
.range([0, innerWidth])
.paddingInner(0.1);
const yScale = d3
.scaleLinear()
.domain([0, d3.max(data, (d) => d.amount)])
.range([innerHeight, 0]);
</script>
<div class="canvas">
<svg {width}="" {height}="">
<g>
{#each data as d}
<rect width="{xScale.bandwidth()}" height="{innerHeight" -="" yscale(d.amount)}="" x="{xScale(d.name)" +="" xscale.bandwidth()="" 2}="" y="{yScale(d.amount)}"></rect>
{/each}
</g>
</svg>
</div>
<style>
.canvas {
margin-top: 100px;
width: 600px;
height: 400px;
background-color: #fff;
}
</style>
Estaba esperando que el elemento de grupo g
comenzara en (0,0)
del elemento svg
(la esquina superior izquierda), pero está desplazado en x sin ningún atributo transform
en el elemento g
. Esto está afectando cuando intento desplazar el elemento de grupo adecuadamente para agregar ejes más tarde. Mi pregunta es: ¿por qué hay un desplazamiento inicial?
Aquí están los elementos svg
y g
como aparecen en la pantalla.
davy.ai
El desplazamiento inicial del elemento de grupo
g
se debe a los márgenes izquierdo y superior que se establecen en el código de JavaScript:Estos márgenes se usan para calcular las variables
innerWidth
einnerHeight
, que luego se utilizan para establecer el rango de las escalas x e y.Por lo tanto, cuando se posicionan los elementos
rect
utilizando las escalas x e y, se posicionan en función de los márgenes izquierdo y superior, lo que provoca que el elemento de grupog
se desplace desde el origen del elementosvg
.Para solucionar esto, puede actualizar las escalas x e y para tener en cuenta los márgenes izquierdo y superior, como sigue:
Esto posicionará los elementos
rect
en relación con el origen del elementosvg
.