在尝试绘制堆积柱形图时,我注意到对于其中一个系列中只有 2 个有效数据点的多个系列,图表出现错误:
用于生成的代码与我之前在此处发布的问题中的代码相同。任何人都可以帮忙吗?不知道需要什么其他细节来解决这个问题,所以如果有必要我会提供更多信息..
在尝试绘制堆积柱形图时,我注意到对于其中一个系列中只有 2 个有效数据点的多个系列,图表出现错误:
用于生成的代码与我之前在此处发布的问题中的代码相同。任何人都可以帮忙吗?不知道需要什么其他细节来解决这个问题,所以如果有必要我会提供更多信息..
在Chart
默认情况下,在所有列类型中,用可用空间填充可用空间,DataPoints
当只有少数DataPoints
列存在时,它们的列变得非常胖。
你有两个选择:
您可以在每个缺失X-Value
的地方添加虚拟点;DataPoints
假人应该Y-Values
有0
简单得多:您可以控制列宽。唯一的困难是确定宽度,当然还要找到隐藏良好的“自定义属性”
注意:要使两者都能正常工作,您需要清楚地了解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 设置Maximum
为X-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
显示多少;你不能使用这些值,因为你错过了这么多点..DataPoints
Points.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
因此我们需要将其用作一个因素。