我尝试使用Winforms C#中的标准图表库创建合适的直方图。目前我的直方图如下:
var dataPointSeries = new System.Windows.Forms.DataVisualization.Charting.Series
{
Name = chartName,
Color = Colors.blue,
IsVisibleInLegend = false,
ChartType = SeriesChartType.Column,
MarkerStyle = MarkerStyle.None,
BorderWidth = 1,
BorderColor = Color.White
};
for (int i = 0; i < data.hDataPoints.Count(); i++)
{
dataPointSeries.Points.AddXY(Charts.Functions.RoundValue(data.hDataPoints[i].fromBin), data.hDataPoints[i].probability);
}
chart.Series.Add(dataPointSeries);
chart.Series[0]["PointWidth"] = "1";
我遇到的问题是条形图未正确显示。对于直方图,条形图需要从较低的bin开始并在较高的bin处结束。图表控件在上部或下部纸槽的中间绘制条形,具体取决于您选择哪一个作为X数据点。
知道如何解决这个问题吗?
答案 0 :(得分:2)
您显示的是自动默认显示。
如果要更改它,则需要在X轴中编码所需的正确值。
看起来你想要这个:
Axis ax = chart.ChartAreas[0].AxisX;
ax.Minimum = -500;
ax.Maximum = 5500;
ax.Interval = 1000;
ax.IntervalOffset = -500;
请注意,数据点列之间总是有一个小的间隙,而边界处有一半......
另请注意,在柱形图中,每列(或多列图表,每组数据点)在x轴值处始终居中。其他任何东西都会误导!列的开始/结束即左/右边没有任何意义!! Columns
只是关于他们的中心!
如果您想要其他任何内容(如果您正在制作直方图,则不会这样做),您将使用Area
类型图表。
如果你发现这种反直觉的习惯通过想象添加另一个Series
并且原则会变得清晰......
如果您确定需要将列与值范围相关联,则只需将其x值设置为该范围的中间位置..:
ax.Interval = 1000;
ax.IntervalOffset = 0;
ax.Minimum = 0;
ax.Maximum = 6000;
foreach (DataPoint dp in chart.Series[0].Points) dp.XValue += ax.Interval/2;
再次注意数据点列之间的间隙以及边界处的一半......