Pregunta

¿Alguien tiene un algoritmo decente para calcular los mínimos y máximos de los ejes?

Al crear un gráfico para un conjunto determinado de elementos de datos, me gustaría poder proporcionar el algoritmo:

  • el valor máximo (y) en el conjunto
  • el valor mínimo (y) en el conjunto
  • el número de marcas que aparecerán en el eje
  • un valor opcional que debe aparecer como una marca de verificación (p. ej.cero cuando se muestran valores +ve y -ve)

El algoritmo debería regresar

  • el valor del eje más grande
  • el valor del eje más pequeño (aunque eso podría inferirse del mayor, el tamaño del intervalo y el número de ticks)
  • el tamaño del intervalo

Las garrapatas deben estar a intervalos regulares y deben ser de un tamaño "razonable" (p. ej.1, 3, 5, posiblemente incluso 2,5, pero no más higos significativos).

La presencia del valor opcional distorsionará esto, pero sin ese valor, el elemento más grande debería aparecer entre las dos marcas superiores y el valor más bajo entre las dos inferiores.

Esta es una pregunta que no depende del idioma, pero si existe una biblioteca C#/.NET, sería fantástico;)

¿Fue útil?

Solución

He estado usando jQuery flotar biblioteca de gráficos.Es de código abierto y genera bastante bien ejes/ticks.Sugeriría mirar su código y extraer algunas ideas de allí.

Otros consejos

Bien, esto es lo que se me ocurrió para una de nuestras aplicaciones.Tenga en cuenta que no trata el escenario de "valor opcional" que menciona, ya que nuestro valor opcional es siempre 0, pero no debería resultarle difícil modificarlo.

Los datos se agregan continuamente a la serie, por lo que simplemente mantenemos actualizado el rango de valores de y inspeccionando cada punto de datos a medida que se agregan;esto es muy económico y fácil de seguir.Los valores mínimos y máximos iguales están en casos especiales:un espacio de 0 indica que no se deben dibujar marcadores.

Esta solución no es diferente a la sugerencia anterior de Andrew, excepto que trata, de una manera ligeramente torpe, con algunas fracciones arbitrarias del multiplicador del exponente.

Por último, este ejemplo está en C#.Espero eso ayude.

    private float GetYMarkerSpacing()
    {
        YValueRange range   = m_ScrollableCanvas.
                    TimelineCanvas.DataModel.CurrentYRange;
        if ( range.RealMinimum == range.RealMaximum )
        {
            return 0;
        }

        float   absolute    = Math.Max(
                    Math.Abs( range.RealMinimum ),
                    Math.Abs( range.RealMaximum ) ),
            spacing     = 0;
        for ( int power = 0; power < 39; ++power )
        {
            float   temp    = ( float ) Math.Pow( 10, power );
            if ( temp <= absolute )
            {
                spacing = temp;
            }
            else if ( temp / 2 <= absolute )
            {
                spacing = temp / 2;
                break;
            }
            else if ( temp / 2.5 <= absolute )
            {
                spacing = temp / 2.5F;
                break;
            }
            else if ( temp / 4 <= absolute )
            {
                spacing = temp / 4;
                break;
            }
            else if ( temp / 5 <= absolute )
            {
                spacing = temp / 5;
                break;
            }
            else
            {
                break;
            }
        }

        return spacing;
    }

Puedo recomendar lo siguiente:

  • Establezca un número mínimo de líneas principales visualmente atractivo.Esto dependerá de la naturaleza de los datos que estás presentando y del tamaño del gráfico que estás haciendo, pero 7 es un número bastante bueno.
  • Elige el exponente y el multiplicador en función de una progresión de 1, 2, 5, 10, etc.eso le dará al menos el número mínimo de líneas principales.(es decir.(máx-mín)/(escala x 10^exponente) >= marcas_tick_mínimo)
  • Encuentra el múltiplo entero mínimo de tu exponente y multiplicador que se ajuste a tu rango.Este será el primer tic importante.El resto de garrapatas se derivan de este.

Esto se usó para una aplicación que permitía escalar arbitrariamente los datos y parecía funcionar bien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top