【问题标题】:Oxyplot Polar Diagram with Categories带类别的 Oxyplot 极坐标图
【发布时间】:2020-08-14 11:25:08
【问题描述】:

我想用 oxyplot 创建一个极坐标图。圆轴不应由整数组成,而应由类别组成。 意思而不是 1 ... 10 它应该在情节周围说类别 A 类别 B ...。 MagnitudeAxis 和 AngularAxis 都不提供为轴设置“字符串”的可能性。 但是 CategoryAxis 不能用于绘制极坐标图,因为它不支持角度。

到目前为止我的代码:

var plotModel = new PlotModel { Title = "", }; 
plotModel.PlotType = OxyPlot.PlotType.Polar; 
plotModel.Axes.Add(new OxyPlot.Axes.AngleAxis() 
{ 
    MajorGridlineStyle = LineStyle.Solid, 
    //MinorGridlineStyle = LineStyle.Dot, 
    MajorStep = 1, 
    CropGridlines = false, 
    StartAngle = 450, 
    EndAngle = 90, 
    Minimum = 0, 
    Maximum = 19
});

plotModel.Axes.Add(new OxyPlot.Axes.MagnitudeAxis()
{
    MajorGridlineStyle = LineStyle.Solid,
    Minimum = 0,
    Maximum = 5,
    MajorStep = 1,
    MinorStep = 1
});

var newValues = new OxyPlot.Series.LineSeries { Title = "New Values", StrokeThickness = 1 };

int i = 0;

foreach(var dataRow in details)
{
    newValues.Points.Add(new DataPoint(dataRow.NewValue, i++)); //instead of i++ I would like to put a string of the object dataRow, but this is not supported...
}

由于缺乏在线示例和文档,这是我寻求帮助的最后希望......

【问题讨论】:

  • SO 不是代码编写服务。到目前为止,您尝试了什么?您目前的问题是什么?
  • 提供的代码...我不知道这有什么帮助,因为我正在寻找一个想法(不是最终代码),但如果它有帮助,我很乐意提供它...

标签: c# wpf oxyplot


【解决方案1】:

在我看来,LabelFormatter 属性就是您所需要的。下面的代码在绘图外部创建标签“A 类”、“B 类”...“S 类”。这样做是因为 (char)65 是 'A',(char)66 是 'B' 等等。

plotModel.Axes.Add(new OxyPlot.Axes.AngleAxis()
{
    MajorGridlineStyle = LineStyle.Solid,
    MajorStep = 1,
    CropGridlines = false,
    StartAngle = 450,
    EndAngle = 90,
    Minimum = 0,
    Maximum = 19,
    LabelFormatter = d => $"Category {(char)(d+65)}"
});

【讨论】:

  • 谢谢这是一个很好的提示,但是我真的不想只输入 Cat A、Cat B 而是类别的真实名称,它们彼此完全独立(一个更好的例子是:汽车、卡车、摩托车等……)。这也适用于 LabelFormatter 吗?
  • 这就是为什么你最好用代码示例准确地说明你想要做什么。它可以更轻松地为您提供有用的答案 :-) 我认为您所需要的只是从默认数字标签到您需要的文本的映射,您可以对其进行硬编码或创建字典来执行此操作。我将扩展我的答案以表明这一点。不过,这是一个非常奇怪的极坐标图。
  • 为什么这很奇怪?它非常简洁地显示了一个类别的得分有多好......它可能不像你直接说的那样可读,但它看起来更漂亮......这是我从业务中得到的要求;)但是,下一个问题是,现在轴的标签应该总是水平的,它当前随着图表旋转:-/
【解决方案2】:

根据 Rich N 的回答,我自己找到了一个(讨厌的)解决方法:

plotModel.Axes.Add(new OxyPlot.Axes.AngleAxis() 
{ 
    MajorGridlineStyle = LineStyle.Solid, 
    //MinorGridlineStyle = LineStyle.Dot, 
    MajorStep = 1, 
    CropGridlines = false, 
    StartAngle = 450, 
    EndAngle = 90, 
    Minimum = 0, 
    Maximum = 19,
    LabelFormatter = d => myCategoryList[Convert.ToInt32(d)] //myCategoryList is a list of strings
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 2016-08-17
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 2015-04-05
    • 1970-01-01
    相关资源
    最近更新 更多