vb.net for-loop multidimensional-array charts axis-labels

vb.net - Gráfico: Mostrar más descripciones de valores en X-Axis



for-loop multidimensional-array (2)

Creo que deberías convertir la representación de la fecha de la cadena en un objeto de fecha y hora real antes de agregarlo al gráfico. No lo yourDate pero algo como esto: (donde yourDate es la cadena que yourDate para pasar al cuadro)

Dim format as String = "MM.dd.yyyy" Dim actualDate as Date = Date.ParseExact(yourDate, format) chart.Series(chart.Series.Count - 1).Points.AddXY(actualDate, 4.9)

El gráfico puede administrar objetos de fecha y hora en lugar de cadenas y tiene un código especial que se ocupa de las fechas. Si haces esto, puedes ajustar cómo se muestra formateando:

chart.ChartAreas(0).AxisX.LabelStyle.Format ="MM.dd.yyyy" chart.ChartAreas(0).AxisX.Interval = 1 chart.ChartAreas(0).AxisX.IntervalType = DateTimeIntervalType.Days

Si desea mostrar solo cada dos días, cambie el intervalo a 2

Le muestro un gráfico al usuario que tiene un área de gráfico con un gráfico de líneas. Sobre esto, tengo, por ejemplo, una línea. Esta línea tiene unos 200 valores. Todos esos valores tienen una descripción (por ejemplo, "01.01.2013" , "05.02.2013" y así sucesivamente).

Cuando se muestra el gráfico, solo puedo ver dos descripciones, incluso si hubiera espacio para muchas más descripciones. La línea se muestra correctamente, pero solo se describen dos puntos.

Giré el texto verticalmente para que haya más espacio, pero esto no ayudó. Si muestro menos valores (5 o 10), las descripciones se muestran correctamente.

Así es como se ve realmente (las descripciones son en realidad cadenas, no fechas).

¡Gracias por tu ayuda!

EDITAR : Mi Código:

chart.ChartAreas(0).AxisY.Maximum = 6 chart.ChartAreas(0).AxisY.Minimum = 1 chart.ChartAreas(0).AxisX.LabelStyle.Angle = -90 chart.Series.Clear() chart.ChartAreas(0).AxisY.StripLines.Clear() Dim myStripLine1 as new StripLine() myStripLine1.IntervalOffset = 4 chart.ChartAreas(0).AxisY.StripLines.add(myStripLine1) ''now adding all series chart.Series.Add("Chemie") ''just to take the example in the image above chart.Series(chart.Series.Count - 1).ChartType = DataVisualization.Charting.SeriesChartType.Line chart.Series(chart.Series.Count - 1).BorderWidth = 4 ''now adding quite much values (on every date, every Serie has a value) chart.Series(chart.Series.Count - 1).Points.AddXY("01.03.2011", 4.9)

En cada fecha, se ingresa un nuevo punto para todas las series, pero solo se resaltan aquellos puntos donde tienen valores importantes. Esos valores intermedios se calculan matemáticamente.

Un ejemplo para explicar esto: tengo dos series, una tiene dos valores (6 y 4) en el punto "01.01.2013" y "03.01.2013" . La otra serie tiene 3 valores (4,6,5.5) en "01.01.2013" , "02.01.2013" y "03.01.2013" . Cuando los muestro, la primera serie terminará en la segunda fecha, incluso si hubiera un valor para la tercera fecha. Resolví esto llenando un valor ficticio en la primera serie con la fecha "02.01.2013" que es solo el promedio en este punto (= 5). Este punto simplemente no se resalta con una viñeta de marcador. Así es como dibujo mi gráfica.

EDIT2:

Después de Skippy''s respuesta y el comentario de Skippy''s , mi nueva prueba. La variable MainForm.grades es un Dictionary(Of Integer,Dictionary(Of String, String)) que contiene alrededor de 150 grados.

Dim subjects As New Dictionary(Of Integer, ArrayList) Dim allgrades As New ArrayList For Each grade In MainForm.grades Dim cD As New Dictionary(Of String, String) cD.Add("SUBJECTID", grade.Value("SUBJECTID")) cD.Add("GRADE", grade.Value("GRADE")) cD.Add("DATE", grade.Value("DATE")) allgrades.Add(cD) Next cht_main.ChartAreas(0).AxisX.IntervalType = DateTimeIntervalType.Days cht_main.ChartAreas(0).AxisX.LabelStyle.Angle = -90 Dim gradesDateSorter = New gradesDateSorter() allgrades.Sort(gradesDateSorter) For Each grade In allgrades If Not subjects.ContainsKey(Integer.Parse(grade("SUBJECTID"))) Then subjects.Add(Integer.Parse(grade("SUBJECTID")), New ArrayList) End If Dim gradeDict As New Dictionary(Of String, String) gradeDict.Add("DATE", grade("DATE")) gradeDict.Add("GRADE", grade("GRADE")) subjects(Integer.Parse(grade("SUBJECTID"))).Add(gradeDict) Next For Each subject In subjects ''adding serie cht_main.Series.Add(MainForm.subjects(subject.Key)("NAME")) cht_main.Series(cht_main.Series.Count - 1).ChartType = DataVisualization.Charting.SeriesChartType.Line cht_main.Series(cht_main.Series.Count - 1).BorderWidth = 4 ''cht_main.Series(cht_main.Series.Count - 1).IsXValueIndexed = True For Each grade In subject.Value cht_main.Series(cht_main.Series.Count - 1).Points.AddXY(Date.Parse(grade("DATE")), Double.Parse(grade("GRADE"))) Next Next

En la quinta última fila, comenté IsXValueIndexed=True porque cuando lo activé, el gráfico se genera con una gran cruz roja de error.

SOLUCIÓN

Establecer el intervalo en el eje X hace el truco!

chart.ChartAreas(0).AxisX.Interval = 1

Solución de Skippy''s


Sí, estoy de acuerdo con Michael. Solo puedo agregar a la explicación en este punto.

Al establecer su intervalo:

myStripLine1.IntervalOffset = 4

Usted está garantizando que sus valores del eje X se representarán únicamente, con una frecuencia de 4 valores "eje x genéricos":

Al establecer esto en vale a 1, se obtendrá un valor para cada valor del eje x, que se incrementa como un número entero (en este caso, días)

chart.ChartAreas(0).AxisX.Interval = 1

Y para declarar los valores del eje x para escribir:

DateTimeIntervalType.Days ''Declaration Public Sub Add( _ labelsStep As Double, _ intervalType As DateTimeIntervalType, _ format As String _ ) End Sub chart.ChartAreas(0).AxisX.IntervalType = DateTimeIntervalType.Days ''which as shown in Michael''s answer is parsed to string. Dim format as String = "MM.dd.yyyy" Dim actualDate as Date = Date.ParseExact(yourDate, format)

Como lo menciona Michael en su comentario. Estableciendo el

mySeries.XValueIndexed = True

Cada valor de eje X indexado será trazado.

Como se explica en la siguiente cita, con el enlace proporcionado.

Cada punto de datos en una serie tiene valores X e Y que determinan su posición en el área de trazado. Con algunos gráficos, el valor X de los puntos no es importante y no tiene que proporcionarse. En este caso, las posiciones de los puntos en el área de trazado están determinadas únicamente por su índice de puntos (es decir, su ubicación en la colección de puntos) y sus valores de Y.

Cuando los valores de X están "indexados", el índice de punto de datos, no el valor de X de un punto, se utiliza para determinar la posición de los puntos a lo largo del eje categórico (X). Por ejemplo, en la Figura 1 a continuación, se muestran dos gráficos que muestran los mismos datos. Sin embargo, el primer gráfico utiliza valores X no indexados, por lo tanto, los valores X de esos puntos determinan su ubicación a lo largo del eje x. El segundo gráfico está indexado, por lo tanto, sus índices de puntos se utilizan para determinar su posición a lo largo del eje x. En este caso, los valores de X solo se utilizan para las etiquetas de eje, y nada más.

http://support2.dundas.com/onlinedocumentation/winchart2005/Data_IndexedXValues.html

Obtuve mi información original con respecto a los intervalos y las compensaciones de intervalo en el siguiente sitio:

http://support2.dundas.com/Default.aspx?article=705

Aquí se analiza el tipo de datos y se aborda el problema de los valores resaltados.

En cada fecha, se ingresa un nuevo punto para todas las series, pero solo se resaltan aquellos puntos donde tienen valores importantes

Por ejemplo, suponga que desea crear una StripLine recurrente para resaltar los fines de semana. Establece el intervalo en 7 y su tipo en Días. Como el primer punto es el domingo, establece IntervalOffset en 6 (para significar el sexto día de la semana) y su tipo en Días. El gráfico resultante no muestra la primera línea de franja.

Esta es una explicación para establecer el intervalo.

Una buena regla a seguir cuando se usan las propiedades Interval e IntervalOffset del gráfico es que IntervalOffset debe ser una magnitud de intervalo más baja que el Interval (es decir, Días de intervalo / Horas de Intervalo de intervalo, Años de intervalo / Meses de Intervalo de intervalo, etc.).

He añadido estas fuentes:

  1. Para tu referencia
  2. Para demostrar que también he hecho mi investigación después de determinar el problema, como se indica en mis comentarios anteriores.

Florian, ¿puedes mostrar el código de las etiquetas, propiedades, etc. del eje x? - ayer yvytty

¿Alguna vez consideró componentes de trazado de terceros, como ZedGraph? Lo más probable es que esas pequeñas advertencias ya estén cubiertas allí. ¡Dale un tiro! - Neolisk ayer

En respuesta a ZedGraph aconsejé:

Y: Después de ver tu código.

Hola, ¿puedo aclarar? ¿QUIERES trazar valores diariamente? Creo que tengo su solución, solo necesito una aclaración, tiene todas las herramientas en vb.net

@yvytty, no, las fechas no tienen que ser diarias, tampoco puede haber ningún valor durante mucho tiempo y no quiero un gran lapso en mi gráfico donde no hay datos. En realidad, también podría escribir algunos ejemplos de texto en los valores del eje X, las fechas son confusas. El principal problema es que el gráfico VB de alguna manera calcula un margen muy grande en esas descripciones en el eje X

No muestra que haya formateado la fecha y la cadena de fecha. También se debe tener en cuenta que no está utilizando el formato de fecha en EE. UU. (Estoy en Australia, por lo que tenemos el mismo formato que usted). El tipo de fecha predeterminado es para en-US.

Por favor, consulte el método DateTime.ParseExact

http://msdn.microsoft.com/en-us/library/system.datetime.parseexact.aspx

He tomado fragmentos de MSDN.

Dim dateString, format As String Dim result As Date Dim provider As CultureInfo = CultureInfo.InvariantCulture Parse date and time with custom specifier. dateString = "Sun 15 Jun 2008 8:30 AM -06:00" format = "ddd dd MMM yyyy h:mm tt zzz" result = Date.ParseExact(dateString, format, provider)

Vea el enlace: http://msdn.microsoft.com/en-us/library/w2sa9yss.aspx

El método DateTime.ToString (IFormatProvider) devuelve la representación de cadena de un valor de fecha y hora utilizando el patrón de fecha corta y larga de una cultura específica. El siguiente ejemplo utiliza el método DateTime.ToString (IFormatProvider) para mostrar la fecha y la hora utilizando el patrón de fecha corta y larga para la cultura fr-FR.

Dim date1 As Date = #3/1/2008 7:00AM# Console.WriteLine(date1.ToString(System.Globalization.CultureInfo.CreateSpecificCulture("fr-FR"))) '' Displays 01/03/2008 07:00:00

Consulte este enlace: http://msdn.microsoft.com/en-us/library/system.datetime.aspx

Así que debería irse, algo como esto:

''note Imports System.Globalization Dim format as String = "dd.MM.yyyy" Dim actualDate as Date = Date.ParseExact(yourDate, format, provider) chart.ChartAreas(0).AxisX.LabelStyle.Format ="dd.MM.yyyy" cht_main.ChartAreas(0).AxisX.IntervalType = DateTimeIntervalType.Days cht_main.ChartAreas(0).AxisX.Interval = 1

ADEMÁS:

Double.Parse(grade("GRADE") ''grade is not of type double