Возникла проблема с построением 4-х графиков в Chart. Графики имеют разные максимальные значения, мне же необходимо сделать так, что бы все графики были видны не зависимо от масштаба. Пример в прикрепленном файле.
Настраиваю серию. арию и маркеры:
// Работаем с графиками
chGrafik.Series[0].LegendText = "Е поле";
chGrafik.Series[1].LegendText = "H поле";
chGrafik.Series[2].LegendText = "Глубина";
chGrafik.Series[3].LegendText = "Ток";
chGrafik.ChartAreas[0].AxisX.ScaleView.Zoomable = true;
chGrafik.ChartAreas[0].CursorX.AutoScroll = true;
chGrafik.ChartAreas[0].AxisX.ScrollBar.Enabled = true;
chGrafik.Series[0].IsValueShownAsLabel = false; // при true отображает значение точки в виде метки
chGrafik.Series[0].MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Circle; // стиль маркера точки данных
chGrafik.Series[0].MarkerSize = 6;
chGrafik.Series[0].MarkerColor = chGrafik.Series[0].Color; //цвет точки маркера
chGrafik.Series[0].Font = new Font("Microsoft Sans Serif", 8f, FontStyle.Bold); //настройка шрифта маркера
chGrafik.ChartAreas[1].AxisX.ScaleView.Zoomable = true;
chGrafik.ChartAreas[1].CursorX.AutoScroll = true;
chGrafik.ChartAreas[1].AxisX.ScrollBar.Enabled = true;
chGrafik.Series[1].IsValueShownAsLabel = false; // при true отображает значение точки в виде метки
chGrafik.Series[1].MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Circle; // стиль маркера точки данных
chGrafik.Series[1].MarkerSize = 6;
chGrafik.Series[1].MarkerColor = chGrafik.Series[1].Color; //цвет точки маркера
chGrafik.Series[1].Font = new Font("Microsoft Sans Serif", 8f, FontStyle.Bold); //настройка шрифта маркера
chGrafik.ChartAreas[2].AxisX.ScaleView.Zoomable = true;
chGrafik.ChartAreas[2].CursorX.AutoScroll = true;
chGrafik.ChartAreas[2].AxisX.ScrollBar.Enabled = true;
chGrafik.Series[2].IsValueShownAsLabel = false; // при true отображает значение точки в виде метки
chGrafik.Series[2].MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Circle; // стиль маркера точки данных
chGrafik.Series[2].MarkerSize = 6;
chGrafik.Series[2].MarkerColor = chGrafik.Series[2].Color; //цвет точки маркера
chGrafik.Series[2].Font = new Font("Microsoft Sans Serif", 8f, FontStyle.Bold); //настройка шрифта маркера
chGrafik.ChartAreas[3].AxisX.ScaleView.Zoomable = true;
chGrafik.ChartAreas[3].CursorX.AutoScroll = true;
chGrafik.ChartAreas[3].AxisX.ScrollBar.Enabled = true;
chGrafik.Series[3].IsValueShownAsLabel = false; // при true отображает значение точки в виде метки
chGrafik.Series[3].MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Circle; // стиль маркера точки данных
chGrafik.Series[3].MarkerSize = 6;
chGrafik.Series[3].MarkerColor = chGrafik.Series[3].Color; //цвет точки маркера
chGrafik.Series[3].Font = new Font("Microsoft Sans Serif", 8f, FontStyle.Bold); //настройка шрифта маркера
// рисуем графики
chGrafik.ChartAreas[0].CursorX.IsUserEnabled = true;
chGrafik.ChartAreas[0].CursorX.IsUserSelectionEnabled = true;
chGrafik.ChartAreas[0].AxisX.ScaleView.Zoomable = true;
chGrafik.ChartAreas[0].AxisX.ScrollBar.IsPositionedInside = true;
chGrafik.ChartAreas[1].CursorX.IsUserEnabled = true;
chGrafik.ChartAreas[1].CursorX.IsUserSelectionEnabled = true;
chGrafik.ChartAreas[1].AxisX.ScaleView.Zoomable = true;
chGrafik.ChartAreas[1].AxisX.ScrollBar.IsPositionedInside = true;
chGrafik.ChartAreas[2].CursorX.IsUserEnabled = true;
chGrafik.ChartAreas[2].CursorX.IsUserSelectionEnabled = true;
chGrafik.ChartAreas[2].AxisX.ScaleView.Zoomable = true;
chGrafik.ChartAreas[2].AxisX.ScrollBar.IsPositionedInside = true;
chGrafik.ChartAreas[3].CursorX.IsUserEnabled = true;
chGrafik.ChartAreas[3].CursorX.IsUserSelectionEnabled = true;
chGrafik.ChartAreas[3].AxisX.ScaleView.Zoomable = true;
chGrafik.ChartAreas[3].AxisX.ScrollBar.IsPositionedInside = true;
// Наносим на карту маркеры точек. Строим график
for (int k = 0; k <= latitude.Length - 1; k++)
{
// Расчитываем Максимальнрое минимальное для глубины. выводим глубину
double maxx = Math.Max(Glub[k], Glub[k + 1]);
if (tmax < maxx + maxx)
{
tmax = maxx + maxx;
chGrafik.ChartAreas[0].AxisY.Maximum = maxx + maxx;
chGrafik.ChartAreas[0].AxisY.Minimum = 0;
}
chGrafik.Series[0].Points.AddY(Glub[k]);
chGrafik.ChartAreas[0].AxisX.ScrollBar.Axis.ScaleView.Position = k-15;
double maxx2 = Math.Max(E_Pole[k], E_Pole[k + 1]);
if (tmax2 < maxx2 + maxx2)
{
tmax2 = maxx2 + maxx2;
chGrafik.ChartAreas[1].AxisY.Maximum = maxx2 + maxx2;
chGrafik.ChartAreas[1].AxisY.Minimum = 0;
}
chGrafik.Series[1].Points.AddY(E_Pole[k]);
double maxx3 = Math.Max(Tok[k], Tok[k + 1]);
if (tmax3 < maxx3 + maxx3)
{
tmax3 = maxx3 + maxx3;
chGrafik.ChartAreas[2].AxisY.Maximum = maxx3 + maxx3;
chGrafik.ChartAreas[2].AxisY.Minimum = 0;
}
chGrafik.Series[2].Points.AddY(Tok[k]);
double maxx4 = Math.Max(H_Pole[k], H_Pole[k + 1]);
if (tmax4 < maxx4 + maxx4)
{
tmax4 = maxx4 + maxx4;
chGrafik.ChartAreas[3].AxisY.Maximum = maxx4 + maxx4;
chGrafik.ChartAreas[3].AxisY.Minimum = 0;
}
chGrafik.Series[3].Points.AddY(H_Pole[k]);
//
}
В итоге получилось вот что:
1) Не знаю как отобразить шкалы значений X для всех графиков 2) Область вывода графиков почему то не на весь chart. 3) Необходимо сделать с полосой прокрутки. Сейчас что бы появилась полоса прокрутки необходимо один раз увеличить график мышкой.
Стандартный контрол Chart
имеет всего две оси Y, поэтому реализовать в явном виде стандартными средствами не получится. Если нужен именно такой результат, то лучше всего поискать и попробовать сторонние контролы для построения графиков.
На стандартном контроле можно использовать другой подход. Три графика располагаются над осью Х, их прикрепим к одной из доступных осей Y, например к Primary и выставим на ней логарифмический формат, чтобы одинаково хорошо видеть и большие и маленькие значения. Последний график, который у вас перевернут, привязываем к другой дополнительной оси Y и настраиваем как удобно. Ось X оставляем одну на все. Картинка будет не такая как на рисунке, графики будут более сглаженными за счет логарифмического масштаба, но при этом читаемыми, особенно если добавить к маркерам всплывающие подсказки со значениями. Для графиков с логарифмической осью Y недопустимы значения меньшие либо равные нулю (док).
Еще один вариант разместить несколько Area
по вертикали, чтобы прослеживалась связь по оси X.
Чтобы графики соотносились между собой по оси X, у них должно быть либо одинаковое число точек для построения, либо у точек явно заданы значения по оси X и при этом начальные и конечные точки всех графиков должны иметь одинаковые значения по X.
Большего из стандартного Chart
-а выжать не получится.
Ну и вариант для энтузиастов-трудоголиков - ручная отрисовка и осей, и графиков, и всего остального необходимого на обычной Panel
или UserControl
. Хотя если у вас фиксированные диапазоны значений и не требуется автоматически подгонять масштаб осей, то это тоже не самый плохой вариант, хотя и более сложный, в плане добавления всяких рюшечек доступных в готовых контролах "из коробки".
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Я пишу на C# в AspNet MVC
Есть MVC-проект, в нём несколько десятков контроллеров с кучей различных методов