Отображение 4 графиков

205
01 сентября 2018, 08:30

Возникла проблема с построением 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) Необходимо сделать с полосой прокрутки. Сейчас что бы появилась полоса прокрутки необходимо один раз увеличить график мышкой.

Answer 1

Стандартный контрол Chart имеет всего две оси Y, поэтому реализовать в явном виде стандартными средствами не получится. Если нужен именно такой результат, то лучше всего поискать и попробовать сторонние контролы для построения графиков.

На стандартном контроле можно использовать другой подход. Три графика располагаются над осью Х, их прикрепим к одной из доступных осей Y, например к Primary и выставим на ней логарифмический формат, чтобы одинаково хорошо видеть и большие и маленькие значения. Последний график, который у вас перевернут, привязываем к другой дополнительной оси Y и настраиваем как удобно. Ось X оставляем одну на все. Картинка будет не такая как на рисунке, графики будут более сглаженными за счет логарифмического масштаба, но при этом читаемыми, особенно если добавить к маркерам всплывающие подсказки со значениями. Для графиков с логарифмической осью Y недопустимы значения меньшие либо равные нулю (док).

Еще один вариант разместить несколько Area по вертикали, чтобы прослеживалась связь по оси X.

Чтобы графики соотносились между собой по оси X, у них должно быть либо одинаковое число точек для построения, либо у точек явно заданы значения по оси X и при этом начальные и конечные точки всех графиков должны иметь одинаковые значения по X.

Большего из стандартного Chart-а выжать не получится.

Ну и вариант для энтузиастов-трудоголиков - ручная отрисовка и осей, и графиков, и всего остального необходимого на обычной Panel или UserControl. Хотя если у вас фиксированные диапазоны значений и не требуется автоматически подгонять масштаб осей, то это тоже не самый плохой вариант, хотя и более сложный, в плане добавления всяких рюшечек доступных в готовых контролах "из коробки".

READ ALSO
Есть ли в C# аналог eval? [дубликат]

Есть ли в C# аналог eval? [дубликат]

На данный вопрос уже ответили:

193
Нужна помощь с Asp.Net Core

Нужна помощь с Asp.Net Core

<a asp-action="Create" class="c">Добавить модель</a>

162
Обработка ошибок в проекте MVC

Обработка ошибок в проекте MVC

Есть MVC-проект, в нём несколько десятков контроллеров с кучей различных методов

182