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

时间:2018-04-16 09:13:18

标签: c# winforms mschart

我的chart类型为columns。如何为Y轴添加背景颜色?喜欢这张图中的灰色?这可能吗?我在Visual Studio 2015中使用Chart Control表示Winforms。我的数据来自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();

当前图表: enter image description here

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

graph

1 个答案:

答案 0 :(得分:3)

没有画出灰色的柱子(这很难做对)我看到了两个选择:

以下是使用StackedColumn的解决方案。

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

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

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

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

  • 您需要设置特殊属性StackedGroupName,以便您要堆叠的系列具有相同的名称。

以下是一个例子:

enter image description here

以下是代码:

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];
}

还有一些说明:

  • 要进行堆叠工作,列需要具有数字 x值。确保将代码更改为一些有用的值!!

  • 我只是采用循环索引并在之后添加标签。您也可以使用一个月并使用合适的DateTime格式。我还调整了循环以适应我的表格布局

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

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

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

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

  • 图例中系列的顺序相反,使它们看起来像堆栈。如果您愿意,可以颠倒添加它们的顺序。

您可能希望学习this post,其中讨论了堆叠的一些常见问题。

您的另一个选择是精确覆盖两个图表区域并设置其点和颜色,以使组合效果看起来像您的图像。 Here是一个覆盖两个类似饼图的示例..