none
Использование 2-х графиков в одном поле в Zedgraph RRS feed

  • Вопрос

  • В проекте хочу разместить два разных графика на одном поле (MasterPane), но у меня выходит вот такая проблема. Скриншот:

    Так вот, если вы обратите внимание, то справа графики не расположенны друг под другом, хотя графики должны располагаться строго друг по другом. Пример я брал отсюда (Пример) и немного подправил для моих требований отображать колонки вместо кривой.

    Вот мой код:

    private void CreateGraph_ThreeVerticalPanes(ZedGraphControl z1)
            {
                MasterPane master = z1.MasterPane;
                master.Fill = new Fill(Color.White, Color.FromArgb(220, 220, 255), 45.0f);
                master.PaneList.Clear();
                master.Title.IsVisible = true;
                master.Title.Text = "My data";
                master.Margin.All = 10;
                master.InnerPaneGap = 5;
                string[] yLabels = { "Graph-1", "Graph-2" };
                for (int j = 0; j < 2; j++)
                {
                    GraphPane myPaneT = new GraphPane(new Rectangle(10, 10, 10, 10), "", "", yLabels[j]);
                    myPaneT.Fill.IsVisible = false;
                    myPaneT.Chart.Fill = new Fill(Color.White, Color.LightYellow, 45.0F);
                    myPaneT.BaseDimension = 3.0F;
                    myPaneT.Legend.IsVisible = false;
                    myPaneT.Border.IsVisible = false;
                    myPaneT.Title.IsVisible = false;
                    myPaneT.XAxis.MajorTic.IsOutside = false;
                    myPaneT.XAxis.MinorTic.IsOutside = false;
                    myPaneT.XAxis.MajorGrid.IsVisible = true;
                    myPaneT.XAxis.MinorGrid.IsVisible = true;
                    myPaneT.Margin.All = 0;
                    if (j == 0)
                    {
                        myPaneT.Margin.Top = 20;
                        myPaneT.XAxis.Title.IsVisible = false;
                        myPaneT.XAxis.Scale.IsVisible = false;
                    }
                    if (j == 1)
                    {
                        
                        myPaneT.Margin.Bottom = 10;
                        myPaneT.YAxis.Scale.IsSkipLastLabel = true;
                    }
                    myPaneT.YAxis.MinSpace = 80;
                    myPaneT.Y2Axis.MinSpace = 20;
                    myPaneT.BarSettings.Type = BarType.Cluster;
                    string[] labels = { "Position 1", "Position 2", "Position 3", "Position 4", "Position 5", "Position 6" };
                    double[] y = { 95, 55, 75, 22, 98, 40 };
                    double[] y2 = { 90, 45, 35, 15, 80, 35 };
                    BarItem myBar = myPaneT.AddBar("Curve 1", null, y, Color.Red);
                    myBar.Bar.Fill = new Fill(Color.Red, Color.White, Color.Red);
                    myBar = myPaneT.AddBar("Curve 2", null, y2, Color.Blue);
                    myBar.Bar.Fill = new Fill(Color.Blue, Color.White, Color.Blue);
                    myPaneT.XAxis.MajorTic.IsBetweenLabels = true;
                    myPaneT.XAxis.Type = AxisType.Text;
                    myPaneT.XAxis.Scale.TextLabels = labels;
                    master.Add(myPaneT);
                }
    
                using (Graphics g = this.CreateGraphics())
                {
                    master.SetLayout(g, PaneLayout.SingleColumn);
                    master.AxisChange(g);
                }
                z1.AxisChange();
            }

    Так же я обратил внимание: если я добавлю строчку кода: 

    myPaneT.XAxis.Scale.IsVisible = false;

    сюда:

    Продолжение в следующем внизу...

Все ответы

  • То у меня границы выровнятся и все будет располагаться так как надо, но уже без лейблов внизу:

    Как мне справится с таким поведением странным?

  • попробуйте изменить шрифт лейблов на крупный размер и лучше на Segoe UI
  • Вы думаете, что ширина нижнего графика напрямую зависит от размера шрифта? Действительно это так, ведь если мы уберем лэйблы, все будет нормально. Конечно, вариацией размера шрифта можно добиться чтобы ширина обоих графиков совпадала, но это так нестабильно, например, если у меня будет в лейблах произвольный текст
    • Изменено Higgs.Boson 23 мая 2013 г. 17:15
  • Вы думаете, что ширина нижнего графика напрямую зависит от размера шрифта? Действительно это так, ведь если мы уберем лэйблы, все будет нормально. Конечно, вариацией размера шрифта можно добиться чтобы ширина обоих графиков совпадала, но это так нестабильно, например, если у меня будет в лейблах произвольный текст
    тогда наверное можно использовать MeasureString
  • И что это мне даст? Не могу проследить за ходом Вашей логики
  • если сделать ограничение по длине символов для произвольного текста и взять первые целые слова, подогнать по ширине или даже по величине шрифта (добавить \n).

    и вот вам очень удобный лэйбл

  • Ничего дельного из этого не выйдет. Во-первых, это очень сложно реализовать, во-вторых, я даже не знаю как в zedgraph'е найти ширину одной секции (по крайней мере этого я не встречал), чтобы потом задать эту ширину секций во втором графике. Проблема решилась изменением расположения графиков. Хотя правильное решение я так и нашел, или это баг или не знаю что. В той ссылке, которую я представлял выше указан явный пример реализации, вот только вместо числовой оси ОХ у меня именованная.

    • Изменено Higgs.Boson 29 мая 2013 г. 11:26