varias una superponer studio punto marcar lineas histogramas graficos graficas grafica algorithm charts graph

algorithm - una - superponer graficas en r



Algoritmo de gráfico(gráfico) (3)

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

Al crear un cuadro para un conjunto determinado de elementos de datos, me gustaría poder dar el algoritmo:

  • el valor máximo (y) en el conjunto
  • el valor mínimo (y) en el conjunto
  • la cantidad de marcas que aparecen en el eje
  • un valor opcional que debe aparecer como un tic (por ejemplo, cero al mostrar los valores + ve y -ve)

El algoritmo debería regresar

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

Las garrapatas deben estar en un intervalo regular que debe ser de un tamaño "razonable" (por ejemplo, 1, 3, 5, posiblemente incluso 2.5, pero no más sig higos).

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

Esta es una pregunta independiente del lenguaje, pero si hay una biblioteca C # /. NET a su alrededor, sería increíble;)


He estado usando la biblioteca de gráficos jQuery flot . Es de código abierto y hace bastante bien la generación de ejes / tics. Sugeriría mirar su código y pellizcar algunas ideas desde allí.


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

Los datos se agregan continuamente a la serie, por lo que mantenemos el rango de valores y actualizado al inspeccionar cada punto de datos como agregado; esto es muy económico y fácil de seguir. Los valores mínimos y máximos iguales son encasillados especiales: un espaciado de 0 indica que no se deben dibujar marcadores.

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

Por último, esta muestra 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 visualmente atractivo de líneas principales. Esto dependerá de la naturaleza de los datos que estás presentando y del tamaño de la trama que estás haciendo, pero 7 es un número bastante bueno
  • Elija el exponente y el multiplicador en función de una progresión de 1, 2, 5, 10, etc. que le dará al menos el número mínimo de líneas principales. (es decir. (max-min) / (escala x 10 ^ exponente)> = minimum_tick_marks)
  • Encuentre el múltiplo entero mínimo de su exponente y multiplicador que se ajuste dentro de su rango. Esta será la primera señal importante. El resto de los ticks se derivan de esto.

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