如何为图表中的列添加背景颜色
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 轴上添加灰色背景,如下所示:
缺少绘制灰色列(这很难正确)我看到两个选项:
- 您可以使用
SeriesChartType.StackedColumn
- 可以叠加两个
ChartAreas
得到设计的效果。
这是一个使用 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,其中讨论了堆叠的一些常见问题。
您的另一个选择是精确叠加两个图表区域并设置它们的点和颜色,以便组合效果看起来像您的图像。 是叠加两个饼状图表的示例..
我有一个 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 轴上添加灰色背景,如下所示:
缺少绘制灰色列(这很难正确)我看到两个选项:
- 您可以使用
SeriesChartType.StackedColumn
- 可以叠加两个
ChartAreas
得到设计的效果。
这是一个使用 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,其中讨论了堆叠的一些常见问题。
您的另一个选择是精确叠加两个图表区域并设置它们的点和颜色,以便组合效果看起来像您的图像。