Zedgraph - 如何自定义基于日期的X轴刻度

7

情况 enter image description here

我正在使用ZedGraph构建一个价格(Y轴)对时间(X轴)的图表。时间跨度为三年。

目前,我得到的X轴标签是:Jan 11; Jan 12; Jan 13,这是一组从2010年3月3日到2013年3月2日运行的数据的默认行为,如果该轴是DateTime类型,则会出现此问题。

问题

如何更改X轴标签,以便我获得:Mar 11; Mar 12; Mar 13?并且更通用地,我可以更改与数据开始/结束月份相对应的标签。


编辑:

我提出的问题最初有点模糊,所以我只是想澄清一下。

我不想让标签变成dd-MMM-yy格式——我想要能够控制标签/刻度出现的X轴位置。

所以对于跨越2010年3月3日至2013年3月2日的X轴,而不是标签始终出现在1月中

  • 11年1月[即2011年1月] ;
  • 12年1月[即2012年1月] ;
  • 13年1月[即2013年1月)

如我屏幕截图所示,我可以选择标签/刻度出现的月份。因此,对于该数据集,我希望在以下标签中:

  • 2010年3月(显示为Mar10)
  • 2011年3月(显示为Mar11)
  • 2012年3月(显示为Mar12)
  • 2013年3月(显示为Mar13)

希望这样更清楚。


如果您想将某个特定日期作为静态变量表示,可以使用 DateTime day = new DateTime( 2012, 1, 1 ); - tmwoods
你尝试过设置 myPane.XAxis.Type = AxisType.DateAsOrdinal 并使用自定义标签吗?可以参考这里。另外,你可能需要设置 Scale.Format = "MM-yy" 看看是否有效。我自己从未尝试过。 - tmwoods
请查看我在答案中的修改。我认为它会起作用;你可能需要稍微调整一下,但希望它能够奏效! - tmwoods
1个回答

8

您需要设置 x 轴属性为

myPane.XAxis.Title.Text = "Date";
myPane.XAxis.Type = AxisType.Date;
myPane.XAxis.Scale.Format = "dd-MMM-yy";
myPane.XAxis.Scale.MajorUnit = DateUnit.Day;
myPane.XAxis.Scale.MajorStep = 1;
myPane.XAxis.Scale.Min = new XDate(DateTime.Now.AddDays(8));
myPane.XAxis.Scale.Max = new XDate(DateTime.Now.AddDays(11));

那会给您提供所请求的日期;如果要从今天开始倒数,可以在AddDays方法中放置减号,并且还可以专门设置日期(只需查看开始键入时的自动完成)。
希望这有所帮助!祝你好运!
编辑:
因此,以下是我可以想出来获取那些自定义刻度的方法: 您必须使用TextObj标签。您还必须摆脱原始刻度:
pane1.MasterPane[0].XAxis.Scale.IsVisible = false;
pane1.MasterPane[0].XAxis.MajorTic.IsAllTics = false;

foreach (double val in x_values)
{
    TextObj text = new TextObj(val.ToString(), pane1.MasterPane[0].YAxis.Scale.Min, val);
    text.Location.AlignH = AlignH.Right;
    text.FontSpec.Border.IsVisible = false;
    text.FontSpec.Fill.IsVisible = false;
    pane1.MasterPane[0].GraphObjList.Add("Mar10"); 

    LineObj line = new LineObj(pane1.MasterPane[0].YAxis.Scale.Min, val, pane1.MasterPane[0].YAxis.Scale.Max, val);
    line.Line.Style = System.Drawing.Drawing2D.DashStyle.Dash;
    line.Line.Width = 1f;
    pane1.MasterPane[0].GraphObjList.Add(line);
}

我从这篇帖子修改了这个代码,我认为它与你的问题相似,只是针对的是Y轴。这是一种不太正式的方法,你需要手动添加每一个标签。实际上,你不需要用foreach循环,我只是因为复制了其他帖子的代码,所以加入了它。希望这能起到作用!

tmwoods:感谢您的回复。恐怕我没有表达清楚。我已经在问题的编辑中尝试更好地解释了自己。 - glaucon
tmwoods:我本意是要说抱歉回复慢了,因为被其他事情占用了时间。 - glaucon
想知道为什么这个答案没有被接受为正确答案。 - Martin
我也很好奇这件事情的结果。我已经根据他的问题编辑进行了修改。不知道他是否看到了或者还是没有解决问题。 - tmwoods
@tmwoods 使用您的示例,我可以在X轴上显示日期,但是我遇到了同步问题,如此处所述。[https://dev59.com/vHDYa4cB1Zd3GeqPFupU] - Martin
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接