2012-02-17 9 views
7

Bien, entonces tengo un eje x de fecha y hora en un MSChart. Quiero trazar meses debajo del primero de cada mes y años debajo del cambio de un año. Esto es lo que tengo hasta ahora:¿Las etiquetas de los ejes secundarios no funcionan?

for (int i = 0; i < rdate.Length -1 ; i++) 
{ 
    if (rdate[i].Day == 01 && set == 0) 

    chart1.ChartAreas[0].AxisX.CustomLabels.Add(
     rdate[i].AddDays(-20).ToOADate(), rdate[i].AddDays(20).ToOADate(), 
     Convert.ToString(rdate[i].ToString("MMMM")), 1, LabelMarkStyle.None); 
    set = 1; 

    if (rdate[i].Day > 01) 
    set = 0; 

    i++; 

    if (rdate[i].Year > rdate[i-1].Year) 

    chart1.ChartAreas[0].AxisX.CustomLabels.Add(
     rdate[i].AddDays(-20).ToOADate(), rdate[i].AddDays(20).ToOADate(), 
     Convert.ToString(rdate[i].ToString("yyyy")), 2, LabelMarkStyle.None);  
} 

Sin embargo, por alguna razón esto se salta algunos meses ... Los años no aparecen en absoluto.

rdate es una matriz de fecha y hora utilizada para rellenar el eje x.

Aquí es un ejemplo de lo que hace mi código: enter image description here

Como se puede ver, las etiquetas se están comportando de forma inesperada. También me gustaría mostrar una marca más grande para estas fechas, y reducir el número de etiquetas de día basadas en el rango de fechas, pero estoy perdido. ¿Alguien ha hecho este tipo de cosas antes?

Respuesta

3

Recientemente tuve un problema similar con MSChart al agregar demasiadas etiquetas al eje x. La solución fue reducir el número de tics sin perder datos.

Este enfoque funcionó para mí, pero tendrá que adaptarlo a sus necesidades específicas.

dataSeries.XValueType = ChartValueType.Auto;

dataSeries.Points.AddXY(record.DateTime, value);

entonces determinó el min y fechas max de los datos correspondientes para determinar el intervalo preferido, su aplicación variará:

var totalDays = (maxDate.Value - minDate.Value).TotalDays;

if (totalDays < 60) 
    chartArea.AxisX.IntervalType = DateTimeIntervalType.Days; 
else if (totalDays < 120) 
    chartArea.AxisX.IntervalType = DateTimeIntervalType.Weeks; 
else 
    chartArea.AxisX.IntervalType = DateTimeIntervalType.Months; 

Especificar el formato de etiqueta AxisX: En su caso y Es posible que tenga que cambiar el Format junto con el intervalo.

chartArea.AxisX.LabelStyle.Format = Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern; 

Con suerte hay algunas partes clave que proporcionarán valor para usted, pero usted todavía tiene que modificarlo para sus necesidades particulares.

+0

+1, gracias por chartArea.AxisX.LabelStyle.Format, no pude encontrarlo por mi vida ;-) – smirkingman

Cuestiones relacionadas