ОксиПлот. Как изменить формат значений рядом с осью с 1000 на 1k

Я пытаюсь изменить формат значения рядом с осью, например, с 1000 на 1k или с 1000000 на 1M.

Возможно ли это в LinearAxis?

Это мой код:

            m.Axes.Add(new LinearAxis
        {
            Position = AxisPosition.Right,
            IsZoomEnabled = false,
            IsPanEnabled = false,
            Minimum = -(_maxPointValue2*0.1),
            Maximum = _maxPointValue2 + (_maxPointValue2*0.1),
            FontSize = 15,
            Key = "right",
            TickStyle = TickStyle.Outside,

        });

Возможно ли это с помощью StringFormat?

Также можно ли изменить TickStyle, чтобы тире проходили через весь сюжет?

заранее спасибо

Майкл


person midi    schedule 20.05.2015    source источник


Ответы (2)


Вы можете использовать свойство LabelFormatter класса Axis, чтобы изменить значение с 1000 на 1K и т. д.

Создайте свою функцию форматирования, чтобы получить двойное значение и вернуть строку:

private static string _formatter(double d)
    {
        if (d < 1E3)
        {
            return String.Format("{0}", d);
        }
        else if (d >= 1E3 && d < 1E6)
        {
            return String.Format("{0}K", d / 1E3);
        }
        else if (d >= 1E6 && d < 1E9)
        {
            return String.Format("{0}M", d / 1E6);
        }
        else if (d >= 1E9)
        {
            return String.Format("{0}B", d / 1E9);
        }
        else
        {
            return String.Format("{0}", d);
        }
    }

Затем добавьте его в класс Axis:

plotmodel.Axes.Add(new LinearAxis
        {
            //Other properties here
            LabelFormatter = _formatter,
        });
person Eric Wilson    schedule 21.05.2015
comment
Есть ли способ изменить интервал, на который параметр увеличивается? Я работаю над аналогичной проблемой, но я не могу правильно настроить интервал. - person Matthew S; 04.09.2018

Я использую этот подход. На основе префиксов показателей. Работает для значений в интервале (-Inf, 0.001> u <1000, +Inf), т.е. 0.001 преобразуется в 1m, 1000 в 1k и т. д.

// Axis
PlotModel.Axes.Add(new LinearAxis
{
    Title = "Value",
    LabelFormatter = ValueAxisLabelFormatter,
});

// ValueAxisLabelFormatter method
private string ValueAxisLabelFormatter(double input)
        {
            double res = double.NaN;
            string suffix = string.Empty;

            // Prevod malych hodnot
            if (Math.Abs(input) <= 0.001)
            {
                Dictionary<int, string> siLow = new Dictionary<int, string>
                {
                    [-12] = "p",
                    [-9] = "n",
                    [-6] = "μ",
                    [-3] = "m",
                    //[-2] = "c",
                    //[-1] = "d",
                };

                foreach (var v in siLow.Keys)
                {
                    if (input != 0 && Math.Abs(input) <= Math.Pow(10, v))
                    {
                        res = input * Math.Pow(10, Math.Abs(v));
                        suffix = siLow[v];
                        break;
                    }
                }
            }

            // Prevod velkych hodnot
            if (Math.Abs(input) >= 1000)
            {
                Dictionary<int, string> siHigh = new Dictionary<int, string>
                {
                    [12] = "T",
                    [9] = "G",
                    [6] = "M",
                    [3] = "k",
                    //[2] = "h",
                    //[1] = "da",
                };

                foreach (var v in siHigh.Keys)
                {
                    if (input != 0 && Math.Abs(input) >= Math.Pow(10, v))
                    {
                        res = input / Math.Pow(10, Math.Abs(v));
                        suffix = siHigh[v];
                        break;
                    }
                }
            }

            return double.IsNaN(res) ? input.ToString() : $"{res}{suffix}";
        }
person honzakuzel1989    schedule 26.10.2016