![如何在 pgfplots 中设置阶梯式图(`const plot`)的间隔?](https://linux22.com/image/302972/%E5%A6%82%E4%BD%95%E5%9C%A8%20pgfplots%20%E4%B8%AD%E8%AE%BE%E7%BD%AE%E9%98%B6%E6%A2%AF%E5%BC%8F%E5%9B%BE%EF%BC%88%60const%20plot%60%EF%BC%89%E7%9A%84%E9%97%B4%E9%9A%94%EF%BC%9F.png)
如何设置 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}