Метки вторичной оси не работают? - PullRequest
7 голосов
/ 17 февраля 2012

Хорошо, у меня есть ось даты и времени на MSChart. Я хочу построить месяцы ниже первого числа каждого месяца, а годы - меньше года. Вот что у меня есть:

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);     
}

Однако по некоторым причинам это пропускает несколько месяцев ... Годы не появляются вообще.

rdate - массив даты и времени, используемый для заполнения оси x.

Вот пример того, что делает мой код: enter image description here

Как видите, ярлыки ведут себя неожиданно. Я также хотел бы показать большую отметку для этих дат и уменьшить количество дневных меток на основе диапазона дат, но я в растерянности. Кто-нибудь делал такие вещи раньше?

1 Ответ

3 голосов
/ 26 февраля 2012

У меня недавно была похожая проблема с MSChart при добавлении слишком большого количества меток к оси x.Решением было сокращение числа тиков без потери данных.

Этот подход работал для меня, но вам придется адаптировать его к вашим конкретным потребностям.

dataSeries.XValueType = ChartValueType.Auto;

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

Затем я определил минимальную и максимальную даты для заданных данных, чтобы определить предпочтительный интервал, ваша реализация будет варьироваться:

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;

Укажите формат метки AxisX: в вашем случае вам, возможно, придется изменить Format вместе с интервалом.

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

Надеемся, что есть некоторые ключевые части, которые обеспечат вам ценность, но вам все равно придется изменитьэто для ваших конкретных потребностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...