如何在条形图图例中显示系列数据

时间:2016-11-08 16:55:02

标签: c# winforms charts bar-chart legend

我有一个Windows窗体应用程序,它显示存储在数据库中的数据的图形。我能够将数据显示在条形图或饼图中。但条形图中的图例仅显示“Series1”,即系列的名称。饼图图例显示系列数据的正确图例。我搜索过MSDN并发现了几篇关于添加图例的文章,但它们都有相同的结果。

这是我的条形图代码:

        string[] xvals = new string[dt.Rows.Count];
        int[] yvals = new int[dt.Rows.Count];

        for (int i = 0; i < dt.Rows.Count; i++)
        {
            xvals[i] = dt.Rows[i]["XValues"].ToString();
            yvals[i] = Convert.ToInt32(dt.Rows[i]["YValues"].ToString());
        }

        Chart barChart = new Chart();
        ChartArea chartArea = new ChartArea();
        barChart.ChartAreas.Add(chartArea);
        barChart.Dock = DockStyle.Fill;
        barChart.BackColor = Color.Transparent;
        barChart.Palette = ChartColorPalette.Fire;
        barChart.ChartAreas[0].BackColor = Color.Transparent;
        barChart.ChartAreas[0].AxisX.MajorGrid.Enabled = false;
        barChart.ChartAreas[0].AxisY.MajorGrid.Enabled = false;

        Series series1 = new Series
        { Name = "Series1", IsVisibleInLegend = true, ChartType = SeriesChartType.Bar };
        series1.ChartType = SeriesChartType.Column;

        barChart.Series.Add(series1);
        for (int i = 0; i < dt.Rows.Count; i++)
        {
            series1.Points.AddXY(dt.Rows[i]["XValues"].ToString(),
                Convert.ToInt32(dt.Rows[i]["YValues"].ToString()));
            var p1 = series1.Points[i];
            p1.Color = Color.FromArgb((byte)r.Next(90, 255), (byte)r.Next(90, 255), 160);
        }

        barChart.Legends.Add(new Legend("Legend1"));
        barChart.Legends["Legend1"].BackColor = Color.Transparent;
        barChart.Series["Series1"].Legend = "Legend1";
        series1.IsVisibleInLegend = true;

        gbo1.Controls.Add(barChart);

这是我的饼图代码:

            string[] xvals = new string[dt.Rows.Count];
        int[] yvals = new int[dt.Rows.Count];

        for (int i = 0; i < dt.Rows.Count; i++)
        {
            xvals[i] = dt.Rows[i]["XValues"].ToString();
            yvals[i] = Convert.ToInt32(dt.Rows[i]["YValues"].ToString());
        }

        Chart pieChart = new Chart();
        ChartArea chartArea = new ChartArea();
        chartArea.Name = "PieChartArea";
        pieChart.ChartAreas.Add(chartArea);
        pieChart.Dock = DockStyle.Fill;
        pieChart.Location = new Point(0, 50);

        pieChart.Palette = ChartColorPalette.Fire;
        pieChart.BackColor = Color.Transparent;
        pieChart.ChartAreas[0].BackColor = Color.Transparent;

        Series series2 = new Series
        { Name = "Series2", IsVisibleInLegend = true, ChartType = SeriesChartType.Pie };

        pieChart.Series.Add(series2);
        for (int i = 0; i < dt.Rows.Count; i++)
        {
            series2.Points.Add((int)dt.Rows[i]["YValues"]);
            var p2 = series2.Points[i];
            p2.Color = Color.FromArgb((byte)r.Next(90, 255), (byte)r.Next(90, 255), 160);
            p2.LegendText = dt.Rows[i]["XValues"].ToString();
        }

        pieChart.Legends.Add(new Legend("Legend2"));
        pieChart.Legends["Legend2"].BackColor = Color.Transparent;
        pieChart.Series["Series2"].Legend = "Legend2";
        series2.IsVisibleInLegend = true;

        gboReport1.Controls.Add(pieChart);

我错过了什么?请帮忙。

以下是条形图的输出: Bar Chart with bad Legend

以下是饼图的输出: Pie Chart with good Legend

1 个答案:

答案 0 :(得分:0)

这就是BarPie图表设计的工作方式。

ChartTypes图表外,所有Pie 都会在Series.Names中显示SeriesTextsLegend

只有Pie图表,只有一个 Series才能显示DataPoint.YValues[0]

如果你真的想在你的Legend中显示数据点数据,你可以这样做,但当然如果添加多个数据点,它看起来会很拥挤......

这是一个如何添加隐藏常规Legend并添加一个显示数据值的新示例的示例:

chart1.ApplyPaletteColors();
chart1.Legends[0].Enabled = false;

Legend L2 = new Legend();
chart1.Legends.Add(L2);
L2.Docking = Docking.Right;
foreach (DataPoint dp in yourSeries.Points)
{
    LegendItem LI = new LegendItem(dp.YValues[0].ToString("0.##"), dp.Color, "");
    LI.BorderWidth = 0;
    L2.CustomItems.Add(LI);
}

enter image description here

如果您愿意,还可以将这些项目添加到常规Legend;只需创建一个引用并使用上面的代码:

Legend L1 = chart1.Legends[0];

请注意,您无法删除原始Legend中的原始项目。