如何在 pgfplots 中设置阶梯式图(`const plot`)的间隔?

如何在 pgfplots 中设置阶梯式图(`const plot`)的间隔?

如何设置 pgfplotsaddplot使用选项执行时应考虑的精确间隔const plot mark mid?例如:

\documentclass{article}
\usepackage{pgfplots}
\usepackage{filecontents}
\pgfplotsset{compat=1.9}
\begin{filecontents*}{data.csv}
1., 1.
2., 2.
4., 3.
7., 4.
\end{filecontents*}


\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot[const plot mark mid, mark=*] table [col sep=comma] {data.csv};
\end{axis}
\end{tikzpicture}
\end{document}

问题是,当您的输入表在 x 轴上不规则时,pgfplots 会以一种不太方便的方式划分间隔。它只是在中间结束“步骤”到下一个中​​点。所以,我想手动设置间隔。

输出:

在此处输入图片描述

在这种情况下,我想通过提供一个来纠正它宽度列表

{1.,1.,3.,3.}

涵盖以下间隔:

0.5 -- 1.5
1.5 -- 2.5
2.5 -- 5.5
5.5 -- 8.5

这样,这些点就会正好位于台阶的中间。

附加评论

Pgfplots 文档说,可以使用 来避免在两个相邻点的中间绘制垂直线jump mark mid。在我的例子中,它将是

\addplot[jump mark mid, mark=*] table [col sep=comma] {data.csv};

然而,这并不能解决问题,因为水平线保持不变。

答案1

我想出了以下解决方案,需要在原始表格中添加一个附加列。该附加列必须包含我在问题中提到的宽度。

代码分为 3 个不同的部分:

  • 原始点的标记;
  • 偏移const plot(-)相应宽度的一半(黑线);
  • 偏移jump mark right(+) 半宽,用于绘制最后一步(红色虚线)。

data.csv最后一项需要通过使用来忽略中的大部分点skip coords between index={\yini}{\yfin}\yini并且yfin以自动化的方式定义。

\documentclass{article}
\usepackage{pgfplots}
\usepackage{filecontents}
\pgfplotsset{compat=1.9}

\begin{filecontents*}{data.csv}
1., 1., 1.
2., 2., 1.
4., 3., 3.
7., 4., 3.
\end{filecontents*}


\begin{document}
\begin{tikzpicture}
%
\pgfplotstablegetrowsof{data.csv}
\pgfmathsetmacro\yfin{\pgfmathresult-1}
\pgfmathsetmacro\yini{0}
%
\begin{axis}
[minor tick num=3]
%
\addplot[mark=*, only marks] 
table [col sep=comma,
x expr=\thisrowno{0}, y expr=\thisrowno{1}]
{data.csv};
%
\addplot[const plot, black]
table [col sep=comma,
x expr=\thisrowno{0} - 0.5*\thisrowno{2}, y expr=\thisrowno{1}]
{data.csv};
%
\addplot[jump mark right, red, ultra thick, dashed] 
table [col sep=comma,
x expr=\thisrowno{0} + 0.5*\thisrowno{2} , y expr=\thisrowno{1}, skip coords between index={\yini}{\yfin}] 
{data.csv};
%
\end{axis}
\end{tikzpicture}
\end{document}

来自解决方案代码的输出。

相关内容