如何为图表中的列添加背景颜色

How to add background color to columns in chart

我有一个 chart,类型为 columns。如何为 Y 轴添加背景色?喜欢这张图中的灰色吗?这可能吗?我在 Visual Studio 2015 年为 Winforms 使用 Chart Control。我的数据来自 SQL.

填充图表的代码:

chart1.DataSource = dtSalesChart;

foreach (DataRow row in dtSalesChart.Rows)
{
   Series S = new Series(row["Period"].ToString());
   chart1.Series.Add(S);
}

for (int j = 1; j < dtSalesChart.Columns.Count; j++)
  {
    for (int i = 0; i < dtSalesChart.Rows.Count; i++)
      {                            
      chart1.Series[i].Points.AddXY(dtSalesChart.Columns[j].ColumnName, 
      dtSalesChart.Rows[i][j].ToString());
       }
  }

  chart1.Series[0].Color = Color.FromArgb(15, 130, 154);
  chart1.Series[1].Color = Color.FromArgb(117, 193, 205);
  Title title = chart1.Titles.Add("ChartTitle");                 
  title.Text = "Sales By Month";
  title.Font = new Font("Tahoma", 12, FontStyle.Bold);
  title.ForeColor = Color.FromArgb(32, 77, 137);

  chart1.ChartAreas["ChartArea1"].AxisX.Interval = 1;
  chart1.ChartAreas["ChartArea1"].AxisX.MajorGrid.LineColor = Color.White;
  chart1.ChartAreas["ChartArea1"].AxisY.MajorGrid.LineColor = Color.WhiteSmoke;                                        
  chart1.DataBind();

当前图表:

我想在 Y 轴上添加灰色背景,如下所示:

缺少绘制灰色列(这很难正确)我看到两个选项:

这是一个使用 StackedColumn 的解决方案。

您需要做一些事情才能让它发挥作用:

  • 您需要知道灰色列应该走多远的 y 值(最大值)。

  • 您需要为它们添加一个虚拟系列。

  • 您需要将所有系列设置为StackedColumn

  • 你需要设置特殊的属性StackedGroupName让你要叠加的系列同名

这是一个例子:

代码如下:

chart3.Series.Clear();
Series s1 = chart3.Series.Add("S1");
s1.ChartType = SeriesChartType.StackedColumn;
Series s2 = chart3.Series.Add("S2");
s2.ChartType = SeriesChartType.StackedColumn;

Series s0 = chart3.Series.Add("S0");
s0.ChartType = SeriesChartType.StackedColumn;
s0.Color = Color.LightGray;
s0.IsVisibleInLegend = false;

s0["StackedGroupName"] = "Group1";
s1["StackedGroupName"] = "Group1";
s2["StackedGroupName"] = "Group2";

for (int j = 0; j < data.Columns.Count; j++)
{
    for (int i = 0; i < data.Rows.Count; i++)
    {
        double vy = Convert.ToDouble(data.Rows[i][j].ToString());
        chart3.Series[i].Points.AddXY(j, vy);
        if (i==0)  s0.Points.AddXY(j, 800 - vy);
    }
}
List<string> mn = new List<string>() { "J", "F", "M", "A" };
for (int i = 0; i < s0.Points.Count; i++)
{
    s0.Points[i].AxisLabel = mn[i];
}

更多注意事项:

  • 为了堆叠工作,列需要有 numeric x 值。确保将您的代码更改为一些有用的值!!

  • 我简单地获取了循环索引并在之后添加了标签。您也可以花一个月的时间使用 suitable DateTime 格式。我还调整了循环以适合我的 table 布局

  • 我没有添加任何其他样式,也没有使用任何数据绑定。不确定该行在您的代码中的含义。

  • 虚拟 Series s0 获取从 max - yvalue 计算的虚拟值。

  • 我相信我的价值观,并且 Convert 没有 TryParse。选择你的方式!

  • 第二个系列s2不在任何其他系列的堆叠组中,因此它是独立的。

  • 图例中的系列顺序颠倒,使它们看起来像堆栈。您可以根据需要颠倒添加它们的顺序..

您可能想研究 this post,其中讨论了堆叠的一些常见问题。


您的另一个选择是精确叠加两个图表区域并设置它们的点和颜色,以便组合效果看起来像您的图像。 是叠加两个饼状图表的示例..