es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo dividir las etiquetas de mi gráfico tipo donut en varias líneas usando d3.js?

Estoy mostrando etiquetas con mi gráfico de rosquilla de esta manera:

this.graphGroup
      .selectAll('allLabels')
      .data(data_ready)
      .enter()
      .append('text')
      .style('font-size', '24px')
      .text(d => {
        return d.data.name;   //LINE 1
      })
      .attr('transform',`${calculatedValue}`)
      .style('text-anchor', 'start');

Quiero usar esta respuesta ¿Cómo puedo incluir saltos de línea en etiquetas en gráficos D3?, pero agregando el código después de agregar las etiquetas de esta manera:

this.graphGroup
    .selectAll('text')
    .each
    ( function (d) {
      var el = this.d3.select(this);
      console.log(el);
      var words = d.name.split(' ');
      console.log(words);
      el.text('');
      for (var i = 0; i < words.length; i++) {
        var tspan = el.append('tspan').text(words[i]);
        if (i > 0)
          tspan.attr('x', 0).attr('dy', '15');
      }
});

Cuando uso each() en la primera selección, obtengo un error diciendo que la selección no está definida. Intenté agregar el código en la línea 1, pero solo puedo pasar texto a d3.text().

¿Cómo puedo dividir correctamente las etiquetas?

EDIT: También tuve un error diciendo que mi variable local d3 no estaba definida, pero funcionó al crear graphGroup y todas las demás selecciones. Luego importé select directamente de d3.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el problema es que ‘this’ en el segundo bloque de código se refiere a la selección de texto, mientras que ‘this’ en el primer bloque de código se refiere a la selección de graphGroup. Una forma de solucionar esto sería guardar la selección de graphGroup como una variable antes de agregar las etiquetas y luego usar esa variable para seleccionar los elementos de texto para el código de ajuste de línea de palabras:

    const etiquetas = this.graphGroup
          .selectAll('allLabels')
          .data(data_ready)
          .enter()
          .append('text')
          .style('font-size', '24px')
          .text(d => {
            return d.data.name; 
          })
          .attr('transform',`${calculatedValue}`)
          .style('text-anchor', 'start');
    
    etiquetas.each(function(d) {
          const el = d3.select(this);
          const palabras = d.data.name.split(' ');
          el.text('');
    
          for (let i = 0; i < palabras.length; i++) {
            const tspan = el.append('tspan').text(palabras[i]);
            if (i > 0)
              tspan.attr('x', 0).attr('dy', '15');
          }
        });
    

    De esta manera, ‘this’ en la función each() se refiere a los elementos de texto creados en el primer bloque de código. Además, asegúrate de importar las funciones necesarias de d3 al principio de tu código, incluyendo select y selectAll.

Comments are closed.