![如何在 2D PGFPlots 图中创建有角度的网格?](https://linux22.com/image/237086/%E5%A6%82%E4%BD%95%E5%9C%A8%202D%20PGFPlots%20%E5%9B%BE%E4%B8%AD%E5%88%9B%E5%BB%BA%E6%9C%89%E8%A7%92%E5%BA%A6%E7%9A%84%E7%BD%91%E6%A0%BC%EF%BC%9F.png)
有可能吗PGFPlots在轴上显示 45° 高度线?基本上,我要找的是一个由 y=-x + k*1000 定义的网格,k 是自然数。我的数字相当大,例如,对于我的一个图,y 介于 54,000 和 59,000 之间,x 介于 0 和 5000 之间,这dimension too large
在使用 Jake 的解决方案时会导致错误。有没有办法在不将网格线绘制为函数的情况下实现这一点?相应的图是轴相等的。
答案1
更新:现在可以处理大量数据
这是一个宏(以及附带的 pgfplots 样式),它绘制了一个梯度为 -1 的对角网格。无论图的单位长度是多少,也无论轴限值是否明确设置,它都可以工作。它可以处理大数字,但必须小心选择合适的数字diagonal grid spacing
,因为\foreach
循环无法处理超过 45000 个条目(不过,这么多网格线可能没有多大意义)。
/pgfplots/xmin
它首先通过查询键等来确定绘图尺寸中的绘图宽度和高度。/pgfplots/xmax
这必须在定义完所有绘图之后进行,否则值仍可能会发生变化。这就是宏使用 的原因\pgfplotsextra{}
,它告诉 pgfplots 在所谓的“测量阶段”结束时执行代码,即在定义完所有内容之后,但在实际绘制之前。
根据图的宽度和高度确定所需网格线的数量后,\foreach
将执行绘制线条的循环。它使用样式every axis grid
,以便您可以像处理普通网格线一样影响对角网格线的外观。
要激活轴上的对角网格,只需使用diagonal grid
轴选项中的键。
以下是输出示例:
以下是实现。该选项execute at begin plot
仅在 PGFPlots 的开发版本中可用。对于早期版本,只需\diagonalgrid
在第一个图之前调用即可。可以使用以下键调整线的间距diagonal grid spacing
:
\documentclass{article}
\usepackage{pgfplots}
\newcommand{\diagonalgrid}{
\pgfplotsextra{
\pgfkeys{/pgf/fpu}
\pgfmathparse{\pgfkeysvalueof{/pgfplots/diagonal grid spacing}}
\let\spacing=\pgfmathresult
\pgfmathparse{\pgfkeysvalueof{/pgfplots/xmin}}
\let\xmin=\pgfmathresult
\pgfmathparse{\pgfkeysvalueof{/pgfplots/xmax}}
\let\xmax=\pgfmathresult
\pgfmathparse{\pgfkeysvalueof{/pgfplots/ymin}}
\let\ymin=\pgfmathresult
\pgfmathparse{\pgfkeysvalueof{/pgfplots/ymax}}
\let\ymax=\pgfmathresult
\pgfmathparse{round((\pgfkeysvalueof{/pgfplots/xmin}-\spacing)/\spacing)*\spacing}
\let\roundxmin=\pgfmathresult
\pgfmathfloattofixed{\pgfmathresult}
\let\fixedxmin=\pgfmathresult\fixedxmin
\pgfmathparse{round((\pgfkeysvalueof{/pgfplots/xmax}+\spacing)/\spacing)*\spacing}
\let\roundxmax=\pgfmathresult
\pgfmathparse{round((\pgfkeysvalueof{/pgfplots/ymin}-\spacing)/\spacing)*\spacing}
\let\roundymin=\pgfmathresult
\pgfmathfloattofixed{\pgfmathresult}
\let\fixedymin=\pgfmathresult
\pgfmathparse{round((\pgfkeysvalueof{/pgfplots/ymax}+\spacing)/\spacing)*\spacing}
\let\roundymax=\pgfmathresult
\pgfmathparse{(\roundxmax-\roundxmin + \roundymax-\roundymin)/\spacing}
\pgfmathfloattofixed{\pgfmathresult}
\let\totalnumber=\pgfmathresult
\foreach \n in {0,...,\totalnumber}{
\pgfmathparse{(\n * \spacing+ \roundxmin)}
\pgfmathfloattofixed{\pgfmathresult}
\let\currentxmin=\pgfmathresult
\pgfmathparse{(\n * \spacing+ \roundymin)}
\pgfmathfloattofixed{\pgfmathresult}
\let\currentymin=\pgfmathresult
\pgfkeys{/pgf/fpu=false}
\draw [/pgfplots/every axis grid] (axis cs:\fixedxmin,\currentymin) -- (axis cs:\currentxmin,\fixedymin);
}
}
}
\pgfkeys{/pgfplots/diagonal grid/.style={execute at begin axis={\diagonalgrid}}}
\pgfkeys{/pgfplots/diagonal grid spacing/.initial={1}}
\begin{document}
\begin{tikzpicture}
\begin{axis}[axis equal,grid=both,diagonal grid,diagonal grid spacing=1000]
\addplot [domain={10000:15000}]{-0.2*x+50000};
\end{axis}
\end{tikzpicture}
\end{document}