我创建了手动刻度,就像在ilnumerics页面上显示的那样: http://ilnumerics.net/axis-configuration.html。 让我们以x轴上的日期为例。 我的问题如下:
在我的程序中,我想使用交互式鼠标缩放和拖动。但是,如果我这样做,则刻度标签和网格线将从绘图立方体的左右边界绘制出来。 (也在提到的例子中。)
我发现我可以通过使用plotCube的剪切属性来修复网格线问题。对于我的面板尺寸,它看起来像这样:
plotCub.Clipping = new ILClipParams{
Plane0 = new Vector4(1, 0, 0, 0.63f),
Plane1 = new Vector4(-1, 0, 0, 0.63f)
};
但刻度标签仍然在边界外绘制。我现在的解决方法是在plotcube的左侧和右侧放置面板。我想有更好的方法来解决这个问题?!?
另一个问题是裁剪仅适合当前面板尺寸。但我想在运行时更改面板大小,然后裁剪不再适合。 我没有找到如何获得裁剪的正确因素。或者还有其他/更好的解决方案吗?
提前感谢您的帮助!
编辑:对不起,好像我是瞎子!!我现在在动态ticks示例中使用了{em> TickCreationFunc ,就像http://ilnumerics.net/axis-configuration.html#ticks-configuration一样。 这很好用!但现在我遇到了新问题:private void ilPanel1_Load(object sender, EventArgs e)
{
// create some base data:
ILArray<double> A = new Double[,] { { 1, 4, 0 }, { 10, 12, 0 }, { 100, 10, 0 }, { 1000, 18, 0 }, { 10000, 15, 0 } };
// create a line plot and keep a reference to it
var linePlot = new ILLinePlot(ILMath.tosingle(A));
ilPanel1.Scene.Add(new ILPlotCube{
Children = { linePlot },
Axes = {
XAxis = {
Ticks = {
TickCreationFunc = (min, max, count) => {
List<float> ret = new List<float>();
using (ILScope.Enter())
{
// some example ticks
for (double i = 0; i <= 10000; i += 100)
{
// only ticks within the plotcube limits
if ((float)ILMath.log10(i) >= min && (float)ILMath.log10(i) <= max)
{
float mval = (float)ILMath.log10(i);
// add if not allready in the collection
if (!ret.Contains(mval))
ret.Add(mval);
}
}
}
return ret;
},
LabelTransformFunc = (ind, val) => {
String s = "" + (float)(ILMath.round(ILMath.pow(10.0, Convert.ToSingle(val.ToString("f3"))) * 10) / 10.0);
return s;
},
DefaultLabel = {Font = new Font("ProFont", 5), Anchor = new PointF(0.5f, -1.0f)},
},
},
},
ScaleModes = { XAxisScale = AxisScale.Logarithmic },
});
我无法在这些功能中阅读或操纵Ticks,我也不知道该怎么做。
因为我尝试使用 TickCreationFuncEx ,因为我的VisualStudio警告我 TickCreationFunc 不再是最新的?!使用该功能,我可以返回一个完整的 ILTickCollection ,并根据需要设置所有锚点。
但是这个功能似乎并没有被plotcube调用。我忘记了什么吗?
这是我写的。我替换了 TickCreationFunc , LabelTransformFunc 和 DefaultLabel :
TickCreationFuncEx = (min, max, count, axis, scale) => {
IList<ILTick> ret = new List<ILTick>();
// some example ticks
for (double i = 0; i <= 10000; i += 100)
{
// only ticks within the plotcube limits
if ((float)ILMath.log10(i) >= min && (float)ILMath.log10(i) <= max)
{
String s = "" + i;
float mval = (float)ILMath.log10(i);
ret.Add(new ILTick(mval, s));
}
}
Font f = new Font("ProFont", 5);
for (int i = 0; i < ret.Count; i++)
{
ret[i].Label.Font = f;
if (i % 2 == 1)
ret[i].Label.Anchor = new PointF(0.5f, -1.0f);
else
ret[i].Label.Anchor = new PointF(0.5f, 0.25f);
}
return ret;
}
当我调试我的第一个程序版本时,我看到 TickCreationFunc 被反复调用,但在第二个中, TickCreationFuncEx 从未被调用。我究竟做错了什么?
非常感谢您提前寻求帮助!