我想显示一个变量 (var) 在一周内的变化。我的数据在一个文本文件中(可用这里)。时间数据以小时为单位给出,如下图所示。
您知道如何在 x 轴上以 24 小时格式显示时间吗?我的意思是按照这样的顺序:0 6 12 18 0 6 12 18 ... 等等。
我尝试使用来自同一文件的文本标签(使用xtick=data
和xticklabels from table={data.dat}{time}
)。为此,需要在文件中添加具有所需格式的新列。目前,我尝试使用相同的“时间”列。但是数据集太大,导致 x 轴不可读(图片也在链接中)。
我也尝试使用x filter/.code={\pgfmathparse{#1-floor(#1/24)*24}}
。不幸的是,不同的日子相互重叠。我猜这是因为过滤后的数据是浮点数而不是文本(图片也在链接中)。
这是我的代码,
\documentclass{standalone}
\usepackage{tikz,pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
ylabel=var,
xlabel=week hour,
xmin=0, xmax=168,
%xtick=data,
%xticklabels from table={data.dat}{time}
%x filter/.code={\pgfmathparse{#1-floor(#1/24)*24}},
]
\addplot[] table [x=time,y=var,col sep=space] {./data.dat};
\end{axis}
\end{tikzpicture}
\end{document}
有什么想法吗?谢谢!
答案1
这可以通过两个步骤实现。
指定刻度标签(间隔)
您可以使用 指定刻度位置xtick={<min>,<step>,...,<max>}
,并通过将表达式赋予 来解析刻度标签xticklabel
。由于您明确给出了xmin
和xmax
,因此您可以使用 将刻度位置设置为“半自动” xtick={\pgfkeysvalueof{/pgfplots/xmin},<step>,...,\pgfkeysvalueof{/pgfplots/xmax}}
。这样,如果您更改xmin
和/或 ,xmax
您也不必进行编辑xtick
。
将值解析为所需格式
这里它用于\pgfmathparse
解析表达式,并\pgfmathprintnumber{\pgfmathresult}
打印不带小数的数字,这对于实际显示标签至关重要。\pgfmathresult
保存上次调用的值\pgfmathparse
。
例子
\documentclass[tikz]{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
width=15cm,
ylabel=var,
xlabel=week hour,
xmin=0,
xmax=168,
xtick={0,6,...,168},
xticklabel={\pgfmathparse{int(mod(\tick,24))}\pgfmathprintnumber{\pgfmathresult}}
]
\addplot[mark=none] table [x=time,y=var,col sep=space] {./data.dat};
\end{axis}
\end{tikzpicture}
\end{document}
我添加了一个width=15cm
以适应 x 轴上的所有刻度标签。我会考虑只在每个 0 和 12 小时添加刻度标记,只是为了让轴不那么混乱。您也可以选择每 6 小时添加一个小刻度标记,方法是指定minor x tick num=1
,这意味着将有一每个主刻度线之间的小刻度线。
使用xtick={0,12,...,168}
和minor x tick num=1
: