1

在尝试绘制堆积柱形图时,我注意到对于其中一个系列中只有 2 个有效数据点的多个系列,图表出现错误:

在此处输入图像描述

用于生成的代码与我之前在此处发布的问题中的代码相同。任何人都可以帮忙吗?不知道需要什么其他细节来解决这个问题,所以如果有必要我会提供更多信息..

4

1 回答 1

1

Chart默认情况下,在所有列类型中,用可用空间填充可用空间,DataPoints当只有少数DataPoints列存在时,它们的列变得非常胖。

你有两个选择:

  • 您可以在每个缺失X-Value的地方添加虚拟点;DataPoints假人应该Y-Values0

  • 简单得多:您可以控制列宽。唯一的困难是确定宽度,当然还要找到隐藏良好的“自定义属性”

注意:要使两者都能正常工作,您需要清楚地了解X-Values您将拥有的概念!如果您仅在它们碰巧出现时添加点,您将无法添加“缺失”的假人或控制X-Axis范围..

在此处输入图像描述

在此处输入图像描述

这些示例显示一年,DataPoint每月一次。

这是两个选项的代码示例:

private void button1_Click(object sender, EventArgs e)
{
    chart1.Series.Clear();
    Series S = chart1.Series.Add("S1");
    S.ChartType = SeriesChartType.StackedColumn;
    Random R = new Random(123);
    DateTime dt = Convert.ToDateTime("2015-01-01");
    chart1.ChartAreas[0].AxisX.LabelStyle.Format = "dd.MM.yy";
    for (int m = 1; m < 12; m++)
    {
        // This can be a real or a dummy point, depending on a simple condition..
        S.Points.AddXY(dt.AddMonths(m), (m <= 2) ? R.Next(100): 0);
    }
}

这里我们只添加两个点,但以像素为单位控制列宽。此外,我们将 a 设置MaximumX-Axis,以便显示完整的 12 个月范围。为此,我们需要计算DateTime最大值并将其转换.. double

private void button1_Click(object sender, EventArgs e)
{
    chart1.Series.Clear();
    Series S = chart1.Series.Add("S1");
    S.ChartType = SeriesChartType.StackedColumn;
    S.SetCustomProperty("PixelPointWidth", "20"); // <- control the column width in pixels

    Random R = new Random(123);
    DateTime dt = Convert.ToDateTime("2015-01-01");
    chart1.ChartAreas[0].AxisX.LabelStyle.Format = "dd.MM.yy";
    for (int m = 1; m < 12; m++)
    {
        // here we add only a few points:
        if (m <= 2) S.Points.AddXY(dt.AddMonths(m), R.Next(100));  
    }
    // to control the displayed time range we set a Maximum
    chart1.ChartAreas[0].AxisX.Maximum = dt.AddMonths(12).ToOADate();
}

注意:在第二示例中,由于宽度以像素为单位设置,因此不会随! 这意味着如果您使图表非常小,列将重叠!Chart

因此,如果您想要缩放,您可能需要对每个事件进行计算。对于此计算,您必须知道图表应该能够SizeChanged显示多少;你不能使用这些值,因为你错过了这么多点..DataPointsPoints.Count

以下是此类缩放代码的示例:

private void chart1_SizeChanged(object sender, EventArgs e)
{
    int pointCount = 12;
    float columnwidth = 0.3f;
    ChartArea CA = chart1.ChartAreas[0];
    int width = (int)(1f * chart1.ClientSize.Width * 
                      CA.InnerPlotPosition.Width / 100f  / pointCount * columnwidth );
    chart1.Series[0].SetCustomProperty("PixelPointWidth", "" + width);
}

请注意,所有图表Position值都是图表的百分比ClientSize因此我们需要将其用作一个因素。

于 2015-08-23T08:52:15.090 回答