Нарисуйте дату по оси X и время по оси Y с помощью ZedGraph и C#

#c# #winforms #zedgraph

#c# #winforms #zedgraph

Вопрос:

Как мне нарисовать время в ZedGraph (например 00:00, 02:00, 04:00, и т.д.) по оси Y и дату (например, 12-11 апреля, 13-11 апреля, 14-11 апреля и т.д.) По оси X? Для параметров панели установлено значение BarType.Stack .

Пример кода будет очень полезен.

Ответ №1:

Вот пример, который я сконструировал. Я не был уверен, какого рода данные вы бы отображали вдоль оси Y, используя формат времени, за исключением чего-то вроде накопленного количества времени (например, количества отработанных часов сотрудниками).

ZedGraph использует XDate формат времени вдоль осей, которые являются удвоениями, преобразованными из datetimes. Однако в стековой строке я не уверен, сможет ли ZedGraph правильно суммировать время (я не смог заставить его работать). Таким образом, в моем примере я использовал линейный тип для оси Y и изменил формат, чтобы он отображался в виде часов и минут.

Обратите внимание, что были установлены минимальные и максимальные значения масштабов обеих осей. Это особенно важно вдоль оси X, поскольку автоматическая настройка приводит к ошибкам. Некоторые другие настройки, которые я указываю, очищают незначительные отметки и т.д.

Вот пример, показывающий столбчатую диаграмму количества часов, отработанных тремя сотрудниками в течение каждого дня:

 const int NumberOfBars = 5;

GraphPane myPane = zedGraphControl1.GraphPane;
myPane.Title.Text = "Employee Hours";
myPane.BarSettings.Type = BarType.Stack;
myPane.BarSettings.ClusterScaleWidth = 1D;

// X AXIS SETTINGS
myPane.XAxis.Title.Text = "Date";
myPane.XAxis.Type = AxisType.Date;
myPane.XAxis.Scale.Format = "dd-MMM-yy";
myPane.XAxis.Scale.MajorUnit = DateUnit.Day;
myPane.XAxis.Scale.MajorStep = 1;
myPane.XAxis.Scale.Min = new XDate(DateTime.Now.AddDays(-NumberOfBars));
myPane.XAxis.Scale.Max = new XDate(DateTime.Now);
myPane.XAxis.MajorTic.IsBetweenLabels = true;
myPane.XAxis.MinorTic.Size = 0;
myPane.XAxis.MajorTic.IsInside = false;
myPane.XAxis.MajorTic.IsOutside = true;

// Y AXIS SETTINGS
myPane.YAxis.Title.Text = "Hours Worked";
myPane.YAxis.Type = AxisType.Linear;
myPane.YAxis.Scale.Format = @"00:";
myPane.YAxis.Scale.Min = 0;
myPane.YAxis.Scale.Max = 24;
myPane.YAxis.Scale.MajorStep = 1;
myPane.YAxis.MinorTic.Size = 0;

// Construct some sample data
Random r = new Random();
List<double> DatesX = new List<double>();
double[] JohnHours = new double[NumberOfBars];
double[] JoanHours = new double[NumberOfBars];
double[] JaneHours = new double[NumberOfBars];

for (int i = 0; i < NumberOfBars; i  )
{
    DatesX.Add(new XDate(DateTime.Today.AddDays(-i)));
    JohnHours[i] = r.Next(1, 9);
    JoanHours[i] = r.Next(1, 9);
    JaneHours[i] = r.Next(1, 9);
}
myPane.AddBar("John", DatesX.ToArray(), JohnHours, Color.Red);
myPane.AddBar("Joan", DatesX.ToArray(), JoanHours, Color.Blue);
myPane.AddBar("Jane", DatesX.ToArray(), JaneHours, Color.Green);
  

Столбчатая диаграмма с накоплением часов