c# - 直方图/柱形图不显示一直到底部的条形图

标签 c# charts histogram

我正在尝试使用 C# .NET 图表控件 ( System.Windows.Forms.DataVisualization.Charting ) 绘制直方图。

我将其设置为柱形图。数据是使用 NMath 库通过直方图对象检索的,因此它会进行所有分类到箱子等操作。一切看起来都很好,直到我将 y 轴切换为对数刻度。为了让事情显示出来,我将具有 0 个条目的任何 bin 的数据点设置为 y 值 0.001 而不是 0。然后我将 y 轴的最小值设置为 0.1,将最大值设置为超出最大 bin 的值.结果是所有列都从 y 值 1 而不是最小值开始。任何具有 0 个条目的 bin 都有一个向下延伸的列(朝向 0.001)。截图可用here

在轴上设置最小/最大/间隔的代码如下。

double ymin = FindMinimumYValue();
double mag = Math.Floor(Math.Log10(ymin));
ymin = Math.Pow(10, mag);
yAxis.Minimum = ymin;
double ymax = FindMaximumYValue();
mag = Math.Ceiling(Math.Log10(ymax));
ymax = Math.Pow(10, mag);
yAxis.Maximum = ymax;

yAxis.Interval = 1;
yAxis.MajorGrid.Interval = 1;
yAxis.MajorTickMark.Interval = 1;
yAxis.MinorGrid.Interval = 1;
yAxis.MinorTickMark.Interval = 1;

我可能没有在我需要的轴上设置属性,但是有没有办法让所有列都从 y 轴上的最小值向上延伸,即使该最小值小于 1?

ETA:如果我从系列中删除计数为 0 的数据点,我将不再得到 0.1 和 1 之间的向下条。但是,所有其他条仍然从 1 开始向上,而不是从最小值开始。

再次预计到达时间:我想我可以使用 RangeColumn 类型的图表,并为每个 bin 指定最小和最大 y 值。这看起来不太优雅,因为当用户将轴切换到日志模式并返回时,我需要在 RangeColumn 和 Column 类型之间切换,或者继续调整 RangeColumn 数据点的最小 y 值(从 0 到 0.1 和背部)。这似乎更像是一种变通方法,而不是解决方案。

最佳答案

解决方法是为每个 x 值添加一个 Y 值为 0 的数据点。

    Series = chart1.Series.Add("Test");
    Axis yAxis = chart1.ChartAreas[0].AxisY;
    yAxis.IsLogarithmic = true;
    double ymin = 0.1;
    yAxis.Minimum = ymin;
    double ymax = 100;
    yAxis.Maximum = ymax;

    Series.Points.Add(new DataPoint(1, 3));
    Series.Points.Add(new DataPoint(1, 0));
    Series.Points.Add(new DataPoint(2, 3));
    Series.Points.Add(new DataPoint(2, 0));
    Series.Points.Add(new DataPoint(3, 4));
    Series.Points.Add(new DataPoint(3, 0));
    Series.Points.Add(new DataPoint(4, 5));
    Series.Points.Add(new DataPoint(4, 0));

关于c# - 直方图/柱形图不显示一直到底部的条形图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21612542/

相关文章:

charts - Google Charts 更改时间线 X 轴字体的颜色

javascript - Chart.js 在线图顶部裁剪

javascript - Am Chart - 如何在 X 轴上显示所有值?

python - 如何防止matplotlib中左x轴延伸到右x轴?

javascript - D3.js 直方图 bin 大小增量

C# 将 long 转换为字符串

c# - 参数化实例化如何与单实例生命范围一起工作

音频分割

c# - 为什么 ASP.NET MVC 实体编码所有 8 位字符 > ansi 127?

c# - 我怎样才能将其重构为更易于管理的代码?