gpt4 book ai didi

c# - 让柱形图在图表控件中重叠

转载 作者:行者123 更新时间:2023-11-30 20:18:39 24 4
gpt4 key购买 nike

我有以下问题:我需要在图表控件中显示多个列(一个图表区域中大约有七个系列)。现在,当我有一个“列”类型的图表时,所有七个列都会并排显示。我想做的是重叠它们。这可能吗?

以下两个解决方案对我没有帮助:

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

结果如下:

enter image description here

请注意,要访问系列颜色,您需要 apply他们到图表:

  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”列消失。

关于c# - 让柱形图在图表控件中重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40801190/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com