例如,我想在散点图下方添加直线,以划定 |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
命令找到 的最大值x
(x
因为 的第二个参数\findmax
是0
,所以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}