Диаграмма Winform с меткой оси X между 2 часами - PullRequest
0 голосов
/ 31 октября 2019

У меня есть Datatable, связанный с графиком. Дата может состоять из двух столбцов: Число и DateTime . Увидеть 1440 возможных столбцов на графике немного излишне, я решил убрать минуты (округляя время до часа, поэтому 14:20 станет 14:00). Проблема с этим заключается в том, что метка просто показывает 14. Я хочу, чтобы она показывала 14-15, 15-16, 16-17, как в знак того, что число принадлежит между этими моментами времени.

Это то, что я сейчас использую:

chart1.ChartAreas["ChartArea1"].AxisX.IntervalType = DateTimeIntervalType.Hours;
chart1.ChartAreas["ChartArea1"].AxisX.LabelStyle.Format = "HH";

Есть ли возможность изменить метку так, чтобы это было что-то вроде HH + (HH + 1)?

Также в качестве бонуса, возможно ли также сделать DateTimeInterval полчаса вместо полного часа (14: 00-14:30, 14: 30-15: 00 и т. Д. на)

1 Ответ

1 голос
/ 31 октября 2019

Вы можете использовать событие Chart.FormatNumber , чтобы переопределить метку представленной оси, чтобы отобразить любую желаемую строку.

using System;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        private Random rnd = new Random();

        public Form1()
        {
            InitializeComponent();
            SetupChart();
        }

        private void SetupChart()
        {
            chart1.Series.Clear();
            chart1.Legends.Clear();

            ChartArea area = chart1.ChartAreas[0];
            area.AxisX.IntervalType = DateTimeIntervalType.Hours;
            area.AxisX.LabelStyle.Format = "HH";
            area.AxisX.Interval = 1.0D;

            Series s = new Series("TimeData");
            s.ChartType = SeriesChartType.Point;
            s.ChartArea = area.Name;
            s.XValueType = ChartValueType.DateTime;
            s.YValueType = ChartValueType.Int32;

            DateTime t = DateTime.Today;

            TimeSpan timeIncrement = new TimeSpan(0, 15, 0);

            for (Int32 i = 0; i <= 19; i++)
            {
                s.Points.AddXY(t, rnd.Next(5, 16));
                t = t.Add(timeIncrement);
            }

            chart1.Series.Add(s);
            chart1.FormatNumber += chart1_FormatNumber;

        }


        private void chart1_FormatNumber(object sender, FormatNumberEventArgs e)
        {
            if (e.ElementType == ChartElementType.AxisLabels  && sender == chart1.ChartAreas[0].AxisX)
            {
                DateTime d1 = DateTime.FromOADate(e.Value);
                DateTime d2 = d1.AddHours(1);
                e.LocalizedValue = $"{d1:HH}-{d2:HH}";
            }
        }

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