在图下方添加直线

在图下方添加直线

例如,我想在散点图下方添加直线,以划定 |y| < x 和 |y| < 2 * x 的区域。我编写了类似于下面的代码,该代码给出了令人满意的结果,但需要事先知道数据的范围。我想为这个图形制作一个模板,如果最大横坐标是 1e12 或 0.1,该模板同样有效。我可以用大数字替换代码中的 1 和 .5,但我相信有更简洁的方法来实现这个结果。

一个限制是直线应该是下面散点图的标记。

我当前的代码:

\documentclass{article}

\usepackage{pgfplots}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}
  \begin{axis}
    \tikzset{bisector/.style={black}}
    \tikzset{half bisector/.style={black, dashed}}

    \coordinate (origin) at (axis cs:0,0);
    \draw[bisector] (origin)--(axis cs:1,1);
    \draw[bisector] (origin)--(axis cs:1,-1);
    \draw[half bisector] (origin)--(axis cs:1,.5);
    \draw[half bisector] (origin)--(axis cs:1,-.5);

    \addplot[only marks] table[x=x, y=y] {
      x y
      .3 .7
      .2 .1
      .5 .6
      0.4 -0.5
    };
  \end{axis}
\end{tikzpicture}
\end{document}

其输出:

示例输出

答案1

您可以利用 PGFPlots 将轴限制存储在键/pgfplots/xmin和中的事实/pgfplots/xmax:您可以使用

\draw (axis cs:\pgfkeysvalueof{/pgfplots/xmin},0.5*\pgfkeysvalueof{/pgfplots/xmin})
    -- (axis cs:\pgfkeysvalueof{/pgfplots/xmax},0.5*\pgfkeysvalueof{/pgfplots/xmax});

按照这样的定义,线条将始终从图的一端延伸到另一端。输入起来有点乏味,因此定义如下命令可能是一个好主意

\newcommand{\straightline}[2][]{%
    \draw[#1] (axis cs:\pgfkeysvalueof{/pgfplots/xmin},#2*\pgfkeysvalueof{/pgfplots/xmin})
        -- (axis cs:\pgfkeysvalueof{/pgfplots/xmax},#2*\pgfkeysvalueof{/pgfplots/xmax});
}

然后你只需输入

\straightline[half bisector]{0.5}

在您的代码中:

\documentclass{article}

\usepackage{pgfplots}
\usepackage{tikz}

\newcommand{\straightline}[2][]{%
    \draw[#1] (axis cs:\pgfkeysvalueof{/pgfplots/xmin},#2*\pgfkeysvalueof{/pgfplots/xmin})
        -- (axis cs:\pgfkeysvalueof{/pgfplots/xmax},#2*\pgfkeysvalueof{/pgfplots/xmax});
}

\begin{document}
\begin{tikzpicture}
  \begin{axis}
    \tikzset{bisector/.style={black}}
    \tikzset{half bisector/.style={black, dashed}}

    \addplot[only marks, red] table[x=x, y=y] {
      x y
      .3 .7
      .2 .1
      .5 .6
      2.4 -2.5
    };

 \straightline{1}
 \straightline{-1}
 \straightline[half bisector]{0.5}
 \straightline[half bisector]{-0.5}
  \end{axis}
\end{tikzpicture}
\end{document}

答案2

您可以使用 将数据保存在表中\pgfplotstableread,然后使用\findmax命令找到 的最大值xx因为 的第二个参数\findmax0,所以1使用 找到最大值y),最后使用存储在宏中的这个最大值\max来绘制角平分线。

\documentclass{article}
\usepackage{filecontents}
\usepackage{pgfplotstable}
\usepackage{pgfplots}
\usepackage{tikz}

\newcommand{\findmax}[2]{
    \pgfplotstablesort[sort key={#2},sort cmp={float >}]{\sorted}{#1}%
    \pgfplotstablegetelem{0}{#2}\of{\sorted}%
    \let\max=\pgfplotsretval%
}

\pgfplotstableread{
.3 .7
.2 .1
.5 .6
0.4 -0.5
3.0 1.2
}\data

\begin{document}
\findmax{\data}{0}
\begin{tikzpicture}
  \begin{axis}[xmin=0]
    \tikzset{bisector/.style={black}}
    \tikzset{half bisector/.style={black, dashed}}

    \coordinate (origin) at (axis cs:0,0);
    \draw[bisector] (origin)--(axis cs:\max*2,\max*2);
    \draw[bisector] (origin)--(axis cs:\max*2,\max*-2);
    \draw[half bisector] (origin)--(axis cs:\max*2,\max);
    \draw[half bisector] (origin)--(axis cs:\max*2,-\max);

    \addplot[only marks] table[x index=0, y index=1] {\data};
  \end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容