【问题标题】:Display tick labels in logarithmic scale MS Chart (log-log)以对数刻度显示刻度标签 MS 图表 (log-log)
【发布时间】:2016-05-15 22:41:24
【问题描述】:

我在 Visual Studio 2015 (C#) 中使用 MS Charts 创建了一个绘图,带有对数刻度(两个轴)(见图)。

我需要在 x 轴上添加更多的网格线和相应的标签。我想在 1 (2, 3, 4...) 和 10 之间以及 10 和 100 (20, 30, 40...) 之间标记每个小刻度,并且我还想在例如之间添加网格线。 10 和 20。

我在图表的轴属性中使用了1 的间隔作为标签,但它不起作用。

【问题讨论】:

标签: c# charts .net-4.5 mschart


【解决方案1】:

在(!)在非零 x 值处添加一个点设置chart.SuppressExceptions = true 您可以将这些属性用于Chartarea ca

ca.AxisX.IsLogarithmic = true;
ca.AxisX.LogarithmBase = 10;

// with 10 as the base it will go to 1, 10, 100, 1000..
ca.AxisX.Interval = 1;

// this adds 4 tickmarks into each interval:
ca.AxisX.MajorTickMark.Interval = 0.25;

// this add 8 gridlines into each interval:
ca.AxisX.MajorGrid.Interval = 0.125;

// this sets two i.e. adds one extra label per interval
ca.AxisX.LabelStyle.Interval = 0.5;
ca.AxisX.LabelStyle.Format = "#0.0";

更新:

由于您不想使用自动标签(始终按值对齐),因此您需要添加 CustomLabels

为此,您需要设置要显示标签的位置/值列表:

    // pick a better name!
    List<double> xs = new List<double>() { 1, 2, 3, 4, 5, 10, 20, 50, 100, 200, 500, 1000};

接下来,我们需要为我们创建的每个CustomLabel 分配一个FromPosition 和一个ToPosition。这总是有点棘手,但在这里甚至比平时更多..

这两个值需要间隔足够远以允许标签适合。所以我们选择一个间隔因子:

    double spacer = 0.9d;

而且我们还关闭了自动拟合机制:

    ca.AxisX.IsLabelAutoFit = false;

现在我们可以添加CustomLabels

    for (int i = 0; i < xs.Count; i++)
    {
        CustomLabel cl = new CustomLabel();
        if (xs[i] == 1 || xs[i] <= 0)
        {
            cl.FromPosition = 0f;
            cl.ToPosition = 0.01f;
        }
        else
        {
            cl.FromPosition = Math.Log10(xs[i] * spacer);
            cl.ToPosition = Math.Log10(xs[i] / spacer);
        }

        cl.Text = xs[i] + "";
        ca.AxisX.CustomLabels.Add(cl);

    }

如您所见,我们需要使用应用于AxisLog10 函数计算值,并且间距是通过乘/除分隔符而不是相加来实现的。间距值也必须按 Log10 进行缩放,并包含在函数中。

我们还需要处理1的值的情况,它相当于0的标签位置;但这在乘法/除法时不会产生任何间距。所以我们手动设置一个合适的ToPosition

我希望我知道一种更简单的方法来做到这一点,但由于标签位置列表确实是您的选择,我怀疑是否有捷径..

我在 40 和 50 处添加了点以显示一个标签如何匹配。还要注意标签位置是如何混合的。随意使用你的!

【讨论】:

  • 当然确实,因为你可以看到如果你看看截图代码的结果
  • 您可能知道,对数刻度中刻度线或网格线之间的间距并不是您图中的线性。我需要在 1 到 10 之间添加:1.1、1.2、1.3、1.4、1.5、1.6...1.9(不是 3.2)
  • 我图中的刻度不是线性的,而是位置的。你从来没有说过你想让下摆按价值线性化。这当然不可能通过设置单个间隔来实现。相反,您需要在需要的位置一一添加自定义标签。 - 您显示的图表具有非线性刻度。它是您要添加标签的真实图表吗?
  • 是的,就是用 MS Chars 生成的图表。我想在两者之间添加刻度(例如在 10 和 11 之间)......当然,它比自定义标签更简单......
  • 好吧,我已经添加了一个如何添加自定义标签的示例。你应该能够像这样创建所有你想要的标签..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-22
  • 2015-09-02
  • 2021-04-16
  • 2021-10-15
相关资源
最近更新 更多