通过添加图例

时间:2019-03-18 13:23:23

标签: c# winforms charts

我正在实时使用图表,通过单独的线程来提供。但是每次我添加另一个系列和图例时,图例都会使图表变小。我找不到任何解决方案。

这是我在添加任何系列之前设置图表的功能:

        chart1.BackColor = Color.DarkGray;
        chart1.ForeColor = Color.White;
        chart1.ChartAreas[0].BackColor = Color.WhiteSmoke;

        chart1.ChartAreas[0].AxisX.LabelStyle.ForeColor = Color.White;
        chart1.ChartAreas[0].AxisX.LineColor = Color.White;
        chart1.ChartAreas[0].AxisX.MajorGrid.LineColor = Color.DarkGray;
        chart1.ChartAreas[0].AxisX.LabelStyle.Format = "HH:mm:ss";

        chart1.ChartAreas[0].AxisY.LabelStyle.ForeColor = Color.White;
        chart1.ChartAreas[0].AxisY.LineColor = Color.White;
        chart1.ChartAreas[0].AxisY.MajorGrid.LineColor = Color.DarkGray;

        chart1.ChartAreas[0].AxisX.Interval = 5;
        chart1.ChartAreas[0].AxisX.IntervalOffset = 1;

        chart1.ChartAreas[0].AxisX.IntervalType = System.Windows.Forms.DataVisualization.Charting.DateTimeIntervalType.Seconds;

        //SetX();
        DateTime act = DateTime.Now;
        DateTime max = act.AddSeconds(60);
        //DateTime min = act.AddSeconds(-30);

        chart1.ChartAreas[0].AxisX.Minimum = act.ToOADate();
        chart1.ChartAreas[0].AxisX.Maximum = max.ToOADate();

当我添加系列/点时:

        if (chart1.Legends.IndexOf(name) == -1)
        {
            //Legend
            chart1.Legends.Add(name);
            chart1.Legends[name].Docking = System.Windows.Forms.DataVisualization.Charting.Docking.Left;
            chart1.Legends[name].LegendStyle = System.Windows.Forms.DataVisualization.Charting.LegendStyle.Column;



        }

        // Must exists
        if (chart1.Series.IndexOf(name) == -1)
        {
            // Series
            chart1.Series.Add(name);
            chart1.Series[name].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.StepLine;
            chart1.Series[name].XValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.DateTime;
            chart1.Series[name].BorderWidth = 4;
            chart1.Series[name].Legend = name;

        }


        DateTime act = DateTime.Now;

        //Get value from string
        switch (format)
        {
            case "BOOL":
                int boolval = value.ToUpper() == "TRUE" ? 1 : 0;
                chart1.Series[name].Points.AddXY(act, boolval);
                break;
            case "DEC":
                int intval = Int32.Parse(value);
                chart1.Series[name].Points.AddXY(act, intval);
                break;
            case "FLOAT":
                float fvalue = float.Parse(value);
                chart1.Series[name].Points.AddXY(act, fvalue);
                break;
        }

        if (act.ToOADate() >= chart1.ChartAreas[0].AxisX.Maximum)
        {
            SetX();
        }

无此行:

chart1.Series[name].Legend = name;

似乎将所有图例连接到一个“ DIV”中,但仍然总是以缩小图表的方式堆叠图例:

enter image description here

图片在这一行。

如何设置图例,以免更改图表的大小?

1 个答案:

答案 0 :(得分:2)

您将需要控制ChartArea的位置和大小。

这是通过将Position中的Automatic设置为固定值来完成的。

请注意,ChartArea.PositionElementPosition,它是

  • 容纳矩形的所有四个元素,因此它不是一个位置,而是一个区域
  • 所有值都位于周围元素的中,即图表的ClientRectangle

示例:

ChartArea ca = chart1.ChartAreas[0];
ca.Position = new ElementPosition(3, 13, 96, 84);

这会在所有面上留下3%的填充,并将ChartArea下移10%。

您将需要使用数字,并可能在需要第二行LegendsLegendItems时进行调整。

enter image description here

默认情况下,系统将一个LegendItem添加到默认Legend中。如果需要更多控制,可以添加自定义LegendItems。有关更多信息,请参见here

默认情况下,系统会调整ChartArea的位置,使其很好地适合默认的Legend。看起来您所做的比代码中显示的要多。