我想绘制时间数据并将日期作为刻度标签。我已阅读第章4.20 符号坐标和用户变换来自 pgfplots 手册,但它不符合我的情况,因为我的日期已经格式化为数字。有一条注释
备注:本节适用于希望使用非标准输入坐标的用户。如果您有不需要转换的普通数字,并且希望使用特殊符号作为刻度标签,则应考虑使用第 224 页中描述的 xticklabels (yticklabels) 键。
因此我阅读了第 224 页及后续内容,但仍无法弄清楚。
pgfplotstable
我认为可以对和 包做一些事情pgfcalendar
,但我再次找不到相关信息。
我最终使用了一种手动解决方案,该解决方案需要在数据发生变化时进行调整,甚至需要scaled ticks=false
在某些特定情况下防止出现重叠。
我怎么能这样做呢干净地?
以下是从我的当前代码中得出的一个例子:
\documentclass{article}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\begin{document}
\begin{tikzpicture}
\pgfplotstableread{
7.3124563e+005 4
7.3139367e+005 3
7.3165463e+005 2
7.3233467e+005 1
7.3262672e+005 6
7.3279571e+005 5
7.3320909e+005 4
7.3338963e+005 3
7.3385267e+005 2
7.3465509e+005 6
}\mytable
\begin{axis}[%
xtick={730852, 731582, 732313, 733043, 733774, 734504},%ugliness here
xticklabels={2001, 2003, 2005, 2007, 2009, 2011},%and there
xlabel={Date},
ylabel={Data},
scale only axis,
width=8cm,
height=5cm,
axis on top,
scaled ticks=false]%and here again!
\addplot table[x index=0,y index=1]{\mytable};
\end{axis}
\end{tikzpicture}
\end{document}
我使用的时间格式来自 MATLAB
datenum
和datestr
函数,它与包使用的格式类似,pgfcalendar
只是需要改变范围。也就是说,一个单位是一天,小数部分给出时间。1-Jan-0000 编码为 0.0,7.3188e+005 对应于 24-Oct-2003 12:45:07。
答案1
我认为修改坐标转换以满足您的需要可能是一件简单的事情。
事实证明,它有以下意想不到的副作用:
- 精度。pgfplots
dateplot
库使用整数算法来移位到date ZERO
。除非有人“正确”地实现这一点,否则您的应用程序将失去这一点。 - 更改 trafo 将需要任何用户输入(如
xmin
或xtick
)数字格式,除非有人实施接受数字和文本日期格式的解决方案。 - matlabs 的输出与预期不同
pgfcalendar
。需要移动数字范围。这需要在整数运算中完成,否则 TeX 的精度有限会导致精度严重下降。
因此,我强烈建议重新配置您的应用程序以将格式正确的文本日期导出为第三列,并配置 pgfplots 以与其date coordinates=x
样式一起读取它。
您可以发布功能请求来实现对上述三个问题的支持。
我有一个正在运行的原型,它忽略了(揭示了)所有这些问题。如果您仍想查看它,可以通过邮件联系我。我不会在这里发布它,因为它可能会产生意想不到的糟糕结果(或者可能根本不出人意料)。