Конфигурация оси ILNumerics

Нужен ваш совет!

Я использую TickCreationFunc и LabelTransformFunc для отображения временной шкалы на XAxis.

Что-то вроде этого:

var plotCube = new ILPlotCube(tag, true);

List<Tuple<double, string>> ticks = null;

plotCube.Axes.XAxis.Ticks.TickCreationFunc = (min, max, qty) =>
{
    ticks = AxisHelper.CreateUnixDateTicks(min, max, qty).ToList();

    return ticks.Select(x => (float)x.Item1).ToList();
};

plotCube.Axes.XAxis.Ticks.LabelTransformFunc = (ind, val) =>
{
    if (ticks != null)
        return ticks[ind].Item2;
    else
        return null;
};

plotCube.Axes.XAxis.ScaleLabel.Visible = false; //does not help

Результат неплохой, но я не смог найти способ убрать метку шкалы.

Ось временной шкалы

Два побочных вопроса:

1) VS показывает предупреждение 'ILNumerics.Drawing.Plotting.ILTickCollection.TickCreationFunc' устарело: '"Вместо этого используйте TickCreationFuncEx!"'. Однако TickCreationFuncEx никогда не вызывается.

2) Есть ли способ указать ILNumerics не сокращать числа тиков?

Ценю твою помощь!


person irriss    schedule 08.04.2015    source источник


Ответы (1)


  1. Это предупреждение важно. Метка шкалы должна исчезнуть, если вы используете новый TickCreationFuncEx. Интерфейс очень похож. Но ваша функция должна возвращать IEnumerable<ILTick>:

    var plotCube = ilPanel1.Scene.First<ILPlotCube>();
    
    List<Tuple<double, string>> ticks = null;
    
    plotCube.Axes.XAxis.Ticks.TickCreationFuncEx = 
        (float min, float max, int qty, ILAxis axis, AxisScale scale) => {
            ticks = CreateUnixDateTicks(min, max, qty).ToList();
    
            return // return IEnumerable<ILTick> here!
    };
    // you should not need this
    //plotCube.Axes.XAxis.ScaleLabel.Visible = false; 
    
  2. Полностью отключить аббревиатуру нельзя. Но вы можете указать количество отображаемых цифр. До 4.7 (из-за ошибки) вам придется использовать это:

    ilPanel1.SceneSyncRoot.First<ILPlotCube>().Axes.XAxis.Ticks.MaxNumberDigitsShowFull = 10; 
    

    Начиная с версии 4.8 вам больше не понадобится SceneSyncRoot и вы можете пойти более прямо:

    ilPanel1.Scene.First<ILPlotCube>().Axes.XAxis.Ticks.MaxNumberDigitsShowFull = 10; 
    // or in your case just 
    plotcube.Axes.XAxis.Ticks.MaxNumberDigitsShowFull = 10;
    

Примечание: в коде используется XAxis, а не YAxis в соотв. к твоему примеру

person Haymo Kutschbach    schedule 08.04.2015
comment
Спасибо, Хаймо, я попробовал решение с помощью TickCreationFuncEx. Проблема в том, что он никогда не вызывается. Посоветуйте что может быть не так. - person irriss; 08.04.2015
comment
Возможно, вам придется установить устаревшую версию на null? В противном случае он имеет приоритет. - person Haymo Kutschbach; 08.04.2015
comment
Какую версию вы используете? - person Haymo Kutschbach; 08.04.2015
comment
Если я установлю для них значение null, я получаю «нулевое исключение ссылки». Я использую версию Nuget, которая, по-моему, 3.3.3. - person irriss; 08.04.2015
comment
ilPanel1.SceneSyncRoot.First‹ILPlotCube›().Axes.XAxis.Ticks.MaxNumberDigitsShowFull = 10; время от времени происходит сбой с исключением «последовательность не содержит элементов», похоже на состояние гонки): - person irriss; 08.04.2015
comment
Да, я должен! Версия Nuget заброшена? Есть планы по обновлению? - person irriss; 08.04.2015