让柱形图在图表控件中重叠
Let column charts overlap in Chart Control
我有以下问题:
我需要在图表控件中显示多个列(一个图表区域中大约有七个系列)。现在,当我有一个 "Column" 类型的图表时,所有七列都会并排显示。我想做的是重叠它们。这可能吗?
以下两个解决方案对我没有帮助:
Plotting overlapping column or bar chart
Chart control two data set bars overlapping
谢谢。
没有内置方法可以做到这一点。
一种解决方法是打开 3-d
,但这将完全改变图表的外观..
另一个是所有者绘制图表。
这对于柱形和条形类型来说并不容易,因为没有公开柱的大小。
另请注意,重叠的列确实会变得更难阅读,尤其是。当你还有 Labels
.
这是一个所有者绘制的柱形图的示例。它有几个简化:
所有 Series
点数相同且对齐,所有 y 值为正且没有其他修饰。他们可能都会被克服,但可能需要一些额外的努力..
private void chart1_PostPaint(object sender, ChartPaintEventArgs e)
{
if (!checkBox2.Checked) return;
int sMax = chart1.Series.Count;
ChartArea ca = chart1.ChartAreas[0];
Axis ax = ca.AxisX;
Axis ay = ca.AxisY;
float py0 = (float)ay.ValueToPixelPosition(ay.Minimum);
Rectangle ipr = Rectangle.Round(InnerPlotPositionClientRectangle(chart1, ca));
int pMax = chart1.Series[0].Points.Count;
float shift = (overlap * sMax) / 2f;
float deltaX = 1f * ipr.Width / (pMax+1);
float colWidth = 1f * deltaX / sMax;
for (int j = 0; j < chart1.Series.Count; j++)
for (int i = 0; i < chart1.Series[j].Points.Count; i++)
{
DataPoint dp = chart1.Series[j].Points[i];
float px = (float)ax.ValueToPixelPosition(dp.XValue);
float py = (float)ay.ValueToPixelPosition(dp.YValues[0]);
using (SolidBrush brush = new SolidBrush(chart1.Series[j].Color))
e.ChartGraphics.Graphics.FillRectangle(brush,
px + j * colWidth - deltaX / 2 - overlap * j + shift, py,
colWidth, py0 - py );
}
}
它使用了一个函数 InnerPlotPositionClientRectangle
,您可以找到 here
结果如下:
请注意,要访问系列颜色,您需要将它们 添加到图表:
chart1.ApplyPaletteColors();
列宽设置如下:
private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
for (int j = 0; j < chart1.Series.Count; j++)
chart1.Series[j]["PointWidth"] = numericUpDown1.Value.ToString();
}
在“0”时,列消失。
Column Series 有一个名为 DrawSideBySide 的 CustomProperties,将其设置为 False 将导致列绘制重叠。
series1.CustomProperties = "DrawSideBySide=False";
也可以在 IDE 中设置,方法是转到属性 window、系列集合编辑器,然后找到 CustomProperties、DrawSideBySide。
我有以下问题: 我需要在图表控件中显示多个列(一个图表区域中大约有七个系列)。现在,当我有一个 "Column" 类型的图表时,所有七列都会并排显示。我想做的是重叠它们。这可能吗?
以下两个解决方案对我没有帮助:
Plotting overlapping column or bar chart
Chart control two data set bars overlapping
谢谢。
没有内置方法可以做到这一点。
一种解决方法是打开
3-d
,但这将完全改变图表的外观..另一个是所有者绘制图表。
这对于柱形和条形类型来说并不容易,因为没有公开柱的大小。
另请注意,重叠的列确实会变得更难阅读,尤其是。当你还有 Labels
.
这是一个所有者绘制的柱形图的示例。它有几个简化:
所有 Series
点数相同且对齐,所有 y 值为正且没有其他修饰。他们可能都会被克服,但可能需要一些额外的努力..
private void chart1_PostPaint(object sender, ChartPaintEventArgs e)
{
if (!checkBox2.Checked) return;
int sMax = chart1.Series.Count;
ChartArea ca = chart1.ChartAreas[0];
Axis ax = ca.AxisX;
Axis ay = ca.AxisY;
float py0 = (float)ay.ValueToPixelPosition(ay.Minimum);
Rectangle ipr = Rectangle.Round(InnerPlotPositionClientRectangle(chart1, ca));
int pMax = chart1.Series[0].Points.Count;
float shift = (overlap * sMax) / 2f;
float deltaX = 1f * ipr.Width / (pMax+1);
float colWidth = 1f * deltaX / sMax;
for (int j = 0; j < chart1.Series.Count; j++)
for (int i = 0; i < chart1.Series[j].Points.Count; i++)
{
DataPoint dp = chart1.Series[j].Points[i];
float px = (float)ax.ValueToPixelPosition(dp.XValue);
float py = (float)ay.ValueToPixelPosition(dp.YValues[0]);
using (SolidBrush brush = new SolidBrush(chart1.Series[j].Color))
e.ChartGraphics.Graphics.FillRectangle(brush,
px + j * colWidth - deltaX / 2 - overlap * j + shift, py,
colWidth, py0 - py );
}
}
它使用了一个函数 InnerPlotPositionClientRectangle
,您可以找到 here
结果如下:
请注意,要访问系列颜色,您需要将它们
chart1.ApplyPaletteColors();
列宽设置如下:
private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
for (int j = 0; j < chart1.Series.Count; j++)
chart1.Series[j]["PointWidth"] = numericUpDown1.Value.ToString();
}
在“0”时,列消失。
Column Series 有一个名为 DrawSideBySide 的 CustomProperties,将其设置为 False 将导致列绘制重叠。
series1.CustomProperties = "DrawSideBySide=False";
也可以在 IDE 中设置,方法是转到属性 window、系列集合编辑器,然后找到 CustomProperties、DrawSideBySide。