OxyPlot。如何将轴旁边的值格式从1000更改为1k

时间:2015-05-20 12:31:25

标签: string-formatting oxyplot

我试图将轴旁边的值格式从1000更改为1k或1000000更改为1M。

这在LinearAxis中是否可行?

这是我的代码:

int stacknewmovie (movie* p, list* l){
if(!p || !l){
   return 0; 
}
 node* n;
 n=newnode();
if(!n){
  return 0;
}
insertnodeinfo(n, p);
n->next=NULL;
if(l->first==NULL){
    l->first=node;                 //problem here replace "node" by "n"??
    return 1;
}else{
    n->next=l->first;
    l->first=n;
    return 1;
}

这可能是StringFormat吗?

还可以更改TickStyle,以便破折号通过整个情节吗?

提前致谢

迈克尔

2 个答案:

答案 0 :(得分:7)

您可以使用Axis类的LabelFormatter属性从1000更改为1K等。

创建格式化函数以获取double并返回一个字符串:

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,
        });

答案 1 :(得分:2)

我使用这种方法。基于Metric prefixes。适用于区间(-Inf, 0.001> u <1000, +Inf)中的值,即0.001转换为1m1000转换为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}";
        }