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:
- Para tu referencia
- 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