以对数刻度显示刻度标签 MS 图表 (log-log)
Display tick labels in logarithmic scale MS Chart (log-log)
我在 Visual Studio 2015 (C#) 中使用 MS Charts 创建了一个图,具有对数刻度(两个轴)(见图)。
我需要在 x 轴上添加更多的网格线和相应的标签。我想标记 1 (2, 3, 4...) 和 10 之间以及 10 和 100 (20, 30, 40...) 之间的每个小刻度线,而且,我想在例如之间添加网格线。 10 和 20.
我在图表的轴属性中使用 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
.
为此,您需要设置 positions/values 列表,您希望在其中显示标签:
// 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);
}
如您所见,我们需要使用应用于 Axis
的 Log10
函数来计算值,并且间距是通过 multiplying/dividing 间隔符实现的,而不是通过添加.间距值也必须按 Log10 缩放并包含在函数中。
我们还需要处理值1
的情况,相当于标签位置0
;但是当 multiplying/dividing 时,这不会导致任何间距。所以我们手动设置一个合适的ToPosition
。
我希望我知道一个更简单的方法来做到这一点,但由于标签位置列表确实是您的选择,我怀疑是否有捷径..
我在 40 和 50 处添加了点以显示一个标签是如何匹配的。还要注意标签位置是如何混合的。随意使用你的!
我在 Visual Studio 2015 (C#) 中使用 MS Charts 创建了一个图,具有对数刻度(两个轴)(见图)。
我需要在 x 轴上添加更多的网格线和相应的标签。我想标记 1 (2, 3, 4...) 和 10 之间以及 10 和 100 (20, 30, 40...) 之间的每个小刻度线,而且,我想在例如之间添加网格线。 10 和 20.
我在图表的轴属性中使用 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
.
为此,您需要设置 positions/values 列表,您希望在其中显示标签:
// 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);
}
如您所见,我们需要使用应用于 Axis
的 Log10
函数来计算值,并且间距是通过 multiplying/dividing 间隔符实现的,而不是通过添加.间距值也必须按 Log10 缩放并包含在函数中。
我们还需要处理值1
的情况,相当于标签位置0
;但是当 multiplying/dividing 时,这不会导致任何间距。所以我们手动设置一个合适的ToPosition
。
我希望我知道一个更简单的方法来做到这一点,但由于标签位置列表确实是您的选择,我怀疑是否有捷径..
我在 40 和 50 处添加了点以显示一个标签是如何匹配的。还要注意标签位置是如何混合的。随意使用你的!