x 轴为 24 小时格式,沿着一整周

x 轴为 24 小时格式,沿着一整周

我想显示一个变量 (var) 在一周内的变化。我的数据在一个文本文件中(可用这里)。时间数据以小时为单位给出,如下图所示。

在此处输入图片描述

您知道如何在 x 轴上以 24 小时格式显示时间吗?我的意思是按照这样的顺序:0 6 12 18 0 6 12 18 ... 等等。

我尝试使用来自同一文件的文本标签(使用xtick=dataxticklabels 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。由于您明确给出了xminxmax,因此您可以使用 将刻度位置设置为“半自动” 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

输出 2

相关内容