C# 绘制重叠柱形图或条形图

C# 绘制重叠柱形图或条形图,c#,charts,mschart,C#,Charts,Mschart,我需要使用柱型或条形图将4系列数据绘制到MSChart。我是否可以绘制这4个系列,以便数据重叠而不是堆叠 我刚刚发现office Excel有一个ChartGroup.Overlap属性 我怎么能在MSChart做呢?如果没有,什么图表控件可以做到这一点?任何信息都将不胜感激。不确定这是否是理想的解决方案,但如果您在一张图表中创建两个图表区域,然后只在另一个图表上绘制一个,则可以重叠序列。这需要大量摆弄位置、尺寸、轴等,以使它们对齐,因此需要一些努力,但会产生以下结果 Chart _chart

我需要使用柱型或条形图将4系列数据绘制到MSChart。我是否可以绘制这4个系列,以便数据重叠而不是堆叠

我刚刚发现office Excel有一个
ChartGroup.Overlap
属性


我怎么能在MSChart做呢?如果没有,什么图表控件可以做到这一点?任何信息都将不胜感激。

不确定这是否是理想的解决方案,但如果您在一张图表中创建两个
图表区域,然后只在另一个图表上绘制一个,则可以重叠序列。这需要大量摆弄位置、尺寸、轴等,以使它们对齐,因此需要一些努力,但会产生以下结果

Chart _chart = new Chart();
TabPage2.Controls.Add(_chart);

_chart.Location = new Point(469, 37);
_chart.Name = "chart1";
_chart.Size = new Size(448, 260);


DataTable dt1 = new DataTable();
dt1.Columns.Add("XVals", typeof(string));
dt1.Columns.Add("YVals1", typeof(int));
dt1.Columns.Add("YVals2", typeof(int));

foreach (string c in "ABCDEF".ToCharArray()) {
    dt1.Rows.Add(c, Convert.ToInt32(Math.Ceiling(VBMath.Rnd() * 20)), Convert.ToInt32(Math.Ceiling(VBMath.Rnd() * 20)));
}

ChartArea firstArea = _chart.ChartAreas.Add("First Area");
Series seriesFirst = _chart.Series.Add("First Series");
seriesFirst.ChartType = SeriesChartType.Column;

ChartArea secondArea = _chart.ChartAreas.Add("Second Area");
secondArea.BackColor = Color.Transparent;
secondArea.AlignmentOrientation = AreaAlignmentOrientations.All;
secondArea.AlignmentStyle = AreaAlignmentStyles.All;
secondArea.AlignWithChartArea = firstArea.Name;
secondArea.AxisY.LabelStyle.Enabled = false;
secondArea.AxisX.LabelStyle.Enabled = false;

Series seriesSecond = _chart.Series.Add("Second Series");
seriesSecond.ChartType = SeriesChartType.Column;
seriesSecond.ChartArea = secondArea.Name;

_chart.DataSource = dt1;
seriesFirst.Points.DataBind(dt1.DefaultView, "XVals", "YVals1", null);
seriesSecond.Points.DataBind(dt1.DefaultView, "XVals", "YVals2", null);

//Aligning the Y axis of the two chart areas
//I am assuming here the x values for both series are similar and dont need to be altered
//If using bar chart then x axis would be modifed not the y axis
secondArea.AxisY = firstArea.AxisY;

// *** Set locational values here for your first chart area***
int heightAboveChartArea = 20;
int heightBelowChartArea = 20;
int axisLabelHeight = 40;
int widthLeftOfChartArea = 20;
int widthRightOfChartArea = 20;
int heightPerBar = 20;
int numberOfPoints = _chart.Series(0).Points.Count;

// *** The following code should not normally be modified ***
_chart.ChartAreas(0).Position.X = widthLeftOfChartArea / _chart.Width * 100;
_chart.ChartAreas(0).Position.Width = 100 - (widthRightOfChartArea / _chart.Width * 100) - _chart.ChartAreas(0).Position.X;
_chart.ChartAreas(0).Position.Y = (heightAboveChartArea / _chart.Height * 100);
_chart.ChartAreas(0).Position.Height = 100 - (heightBelowChartArea / _chart.Height * 100) - _chart.ChartAreas(0).Position.Y;

C#图表具有每个系列的属性。“column”图表类型具有特别针对重叠问题的属性

chart_1.Series["col_name"].CustomProperties = "DrawSideBySide=False";

但是,如果第一个系列值小于第二个系列值,则在图表中看不到第一列值。就像示例图表中的C、D、F列一样。要开始大量定制图表(如excel),解决方案往往会变得非常粗糙。类似的东西会改变柱状图的宽度,因此如果一个系列通常比另一个系列大,则将其加宽并放在后面
\u chart.series(0)(“PixelPointWidth”)=10_图表系列(1)(“像素点宽度”)=15
。据我所知,没有像excel这样的内置重叠,因此任何解决方案都将非常困难,需要手动在图表中放置列、重新排列轴等。请尝试启用3D!感谢您提供这段代码片段,它可能会提供一些有限的、即时的帮助。通过展示为什么这是一个很好的问题解决方案,A将极大地提高它的长期价值,并将使它对未来有其他类似问题的读者更有用。请在您的回答中添加一些解释,包括您所做的假设。