如何在 2D PGFPlots 图中创建有角度的网格?

如何在 2D PGFPlots 图中创建有角度的网格?

有可能吗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轴选项中的键。

以下是输出示例:

带有对角网格线的 pgfplots 图

以下是实现。该选项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}

相关内容