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.

valores negativos faltantes en modo logarítmico

Después de revisar todas las demás preguntas en SOF.

Estoy utilizando el envoltorio HighchartsReact para Highcharts.

Comportamiento esperado:

Mostrar valores negativos en el gráfico de columnas apiladas incluso en escala logarítmica. Al alternar una serie que tiene valores y menores que 0, la escala logarítmica los oculta. Al volver a la escala lineal, los puntos ocultos deberían volver a ser visibles.

Comportamiento actual:

Los valores negativos desaparecen al pasar de lineal a logarítmico. Además, al volver a lineal, los valores negativos que se veían en la escala lineal antes – desaparecen y no forman parte del gráfico. Anteriormente funcionaba hace varias semanas y dejó de funcionar de repente.

Demostración en vivo con pasos para reproducir:

Versión del producto: 9.3.2

¿Cómo puedo agregar esta función usando HighchartsReact? Intenté pasar un callback y también dentro de React.useEffect para usar la referencia del gráfico, pero cualquier cosa que hago, los valores negativos siguen faltando y al volver a lineal simplemente se eliminan los valores negativos originales de la serie.

A continuación se muestra el código proporcionado:

(function (H) {
    H.addEvent(H.Axis, 'afterInit', function () {
        const logarithmic = this.logarithmic;

        if (logarithmic && this.options.custom.allowNegativeLog) {
            // Avoid errors on negative numbers on a log axis
            this.positiveValuesOnly = false;

            // Override the converter functions
            logarithmic.log2lin = num => {
                const isNegative = num < 0;

                let adjustedNum = Math.abs(num);

                if (adjustedNum < 10) {
                    adjustedNum += (10 - adjustedNum) / 10;
                }

                const result = Math.log(adjustedNum) / Math.LN10;
                return isNegative ? -result : result;
            };

            logarithmic.lin2log = num => {
                const isNegative = num < 0;

                let result = Math.pow(10, Math.abs(num));
                if (result < 10) {
                    result = (10 * (result - 1)) / (10 - 1);
                }
                return isNegative ? -result : result;
            };
        }
    });
}(Highcharts));
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para agregar una función que permita mostrar valores negativos en un gráfico de columnas apiladas incluso en una escala logarítmica usando el wrapper HighchartsReact para Highcharts, puedes agregar el siguiente código:

    import React from 'react';
    import Highcharts from 'highcharts';
    import HighchartsReact from 'highcharts-react-official';
    
    const MyChart = () => {
      const options = {
        chart: {
          type: 'column',
        },
        title: {
          text: 'Valores Negativos en Escala Logarítmica',
        },
        xAxis: {
          type: 'category',
        },
        yAxis: [{
          type: 'logarithmic',
          allowNegativeLog: true, // permite valores negativos en la escala logarítmica
        }],
        series: [{
          name: 'Valores Positivos',
          data: [1, 2, 4, 8, 16, 32, 64],
          stack: 'values',
        }, {
          name: 'Valores Negativos',
          data: [-1, -2, -4, -8, -16, -32, -64],
          stack: 'values',
        }],
      };
    
      return (
        <highchartsreact highcharts="{Highcharts}" options="{options}"></highchartsreact>
      );
    };
    
    export default MyChart;
    

    Este código establece la propiedad allowNegativeLog del objeto yAxis como true, lo cual permite valores negativos en la escala logarítmica. El arreglo series también contiene tanto valores positivos como negativos que serán mostrados en el gráfico.

    Puedes personalizar este código y ajustar el objeto options para que se adapte a tus requisitos específicos.

Comments are closed.