我从 Matlab 中获得了一组数据,并据此创建了图形。使用 Latex 绘制的图形效果非常好。我在该图形的背景中添加了一个彩色正方形,效果也很好。这里出现了第一个问题。绘制正方形时,连接标记的线消失了,这是某种层问题吗?
我的主要问题是,如何在图内(中间)放置一个文本框?这个框应该有一个边框,以及一个从框指向曲线上的一个标记点的箭头。文本最多有 3 行,包含数学公式。我第一次尝试显示pgfplotsset
文本,但我不知道如何设置距离和框边框。
我第二次尝试使用draw
显示一个箭头,但绘制彩色方块时它会消失,不知何故这不允许多行文本(\\
或\newline
不起作用)。也许也可以这样做,使选定的标记变为粗体或突出显示?
\documentclass[border=10pt]{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[%
width=4.521in,
scale = 0.6,
height=3.566in,
at={(0.758in,0.481in)},
scale only axis,
separate axis lines,
every outer x axis line/.append style={black},
every x tick label/.append style={font=\color{black}},
xmin=-0.1,
xmax=1.1,
xtick={-0.1, 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1},
xminorticks=true,
xlabel={FAR},
every outer y axis line/.append style={black},
every y tick label/.append style={font=\color{black}},
ymin=-0.1,
ymax=1.2,
ytick={-0.1, 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2},
yminorticks=true,
ylabel={TPR},
axis background/.style={fill=white},
]
\addplot [color=blue,solid,mark=o,mark options={solid},forget plot] %only marks
table[row sep=crcr]{%
1 1\\
1 1\\
1 1\\
1 1\\
0.990942028985507 1\\
0.919466403162056 1\\
0.750101951188908 1\\
0.543799799234582 1\\
0.392296411318151 0.958333333333333\\
0.29586627140975 0.958333333333333\\
0.227355072463768 0.916666666666667\\
0.181159420289855 0.875\\
0.148962450592885 0.791666666666667\\
0.106966403162055 0.75\\
0.0707345191040843 0.75\\
0.039937417654809 0.708333333333333\\
0.0271739130434783 0.666666666666667\\
0.0145750988142293 0.625\\
0.00543478260869565 0.541666666666667\\
0.00181159420289855 0.5\\
0 0.375\\
0 0.333333333333333\\
0 0.291666666666667\\
0 0.25\\
0 0.25\\
0 0.25\\
0 0.25\\
0 0.166666666666667\\
0 0.166666666666667\\
0 0.125\\
0 0.125\\
0 0.125\\
0 0.125\\
0 0.125\\
0 0.125\\
0 0.125\\
0 0.125\\
0 0.125\\
0 0.0833333333333333\\
0 0.0416666666666667\\
0 0.0416666666666667\\
0 0.0416666666666667\\
0 0.0416666666666667\\
0 0.0416666666666667\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
};
%first attempt:
%\pgfplotsset{
% after end axis/.code={
% \node[pin={[text width=3cm,pin edge={black}]-45: {\tiny{sample: text text\\ more text text\\$math equation: \phi$}}}] at (axis cs:0.181, 0.875) { };
% }
%}
% Second attemp:
%\draw[<-](axis cs:0.181, 0.875)-- +(10pt,10pt) node[right] {here\\ test};
\fill [blue!10!white,rounded corners] (axis cs:0,0) rectangle (axis cs:1,1);
\end{axis}
\end{tikzpicture}%
\end{document}
该图像使用pgfplotsset
:
这里我用的是\draw
:
答案1
要在绘图后面绘制彩色方块,只需将 放在\fill
之前\addplot
即可。通常,内容是按照它们添加到代码中的顺序绘制的,因此通过添加第一个,\fill
它最终会位于底部。
要添加带有文本的框,你可以使用以下命令:
\draw[->,shorten >=1mm,shorten <=1mm] (rel axis cs:0.5,0.5) node[right,draw,align=left] {here\\ test} -- (axis cs:0.181, 0.875);
rel axis cs
是一个坐标系,其中 (0,0) 是轴的左下角,(1,1) 是右上角,因此 (0.5,0.5) 是中间。要允许节点中的换行,您必须添加文本的特定对齐方式(此处align=left
)或设置节点中文本区域的宽度(例如text width=2cm
)。shorten <
和shorten >
分别将行的开头和结尾缩短指定的长度。
要绘制 的边框node
,只需将其添加draw
到其选项中,如上所示。如果您想用特定颜色(例如蓝色)绘制它,则写入draw=blue
。(同样,您可以用 来添加背景填充fill=<colorname>
。
\documentclass[border=10pt]{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[%
width=4.521in,
scale = 0.6,
height=3.566in,
at={(0.758in,0.481in)},
scale only axis,
separate axis lines,
every outer x axis line/.append style={black},
every x tick label/.append style={font=\color{black}},
xmin=-0.1,
xmax=1.1,
xtick={-0.1, 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1},
xminorticks=true,
xlabel={FAR},
every outer y axis line/.append style={black},
every y tick label/.append style={font=\color{black}},
ymin=-0.1,
ymax=1.2,
ytick={-0.1, 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2},
yminorticks=true,
ylabel={TPR},
axis background/.style={fill=white},
]
\fill [blue!10!white,rounded corners] (axis cs:0,0) rectangle (axis cs:1,1);
\addplot [color=blue,solid,mark=o,mark options={solid},forget plot] %only marks
table[row sep=crcr]{%
1 1\\
1 1\\
1 1\\
1 1\\
0.990942028985507 1\\
0.919466403162056 1\\
0.750101951188908 1\\
0.543799799234582 1\\
0.392296411318151 0.958333333333333\\
0.29586627140975 0.958333333333333\\
0.227355072463768 0.916666666666667\\
0.181159420289855 0.875\\
0.148962450592885 0.791666666666667\\
0.106966403162055 0.75\\
0.0707345191040843 0.75\\
0.039937417654809 0.708333333333333\\
0.0271739130434783 0.666666666666667\\
0.0145750988142293 0.625\\
0.00543478260869565 0.541666666666667\\
0.00181159420289855 0.5\\
0 0.375\\
0 0.333333333333333\\
0 0.291666666666667\\
0 0.25\\
0 0.25\\
0 0.25\\
0 0.25\\
0 0.166666666666667\\
0 0.166666666666667\\
0 0.125\\
0 0.125\\
0 0.125\\
0 0.125\\
0 0.125\\
0 0.125\\
0 0.125\\
0 0.125\\
0 0.125\\
0 0.0833333333333333\\
0 0.0416666666666667\\
0 0.0416666666666667\\
0 0.0416666666666667\\
0 0.0416666666666667\\
0 0.0416666666666667\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
};
\draw[->,shorten >=1mm,shorten <=1mm] (rel axis cs:0.5,0.5) node[right,draw,align=left] {here\\ test} -- (axis cs:0.181, 0.875);
\end{axis}
\end{tikzpicture}%
\end{document}
第二版
这里首先将数据保存到表中。表中特定行的值被读取并保存到宏中\myX
,然后\myY
使用
\pgfplotstablegetelem{10}{[index]0}\of{\mydata}
\pgfmathsetmacro{\myX}{\pgfplotsretval}
\pgfplotstablegetelem{10}{[index]1}\of{\mydata}
\pgfmathsetmacro{\myY}{\pgfplotsretval}
该\pgfplotstablegetelem{<row no>}{<column>}
宏从表中检索指定的值并将其保存到\pgfplotsretval
。\pgfmathsetmacro
用于定义\myX
和\myY
,而它们又用于绘制红色圆圈并放置箭头。
\documentclass[border=10pt]{standalone}
\usepackage{pgfplots}
\pgfplotstableread[row sep=crcr]{%
1 1\\
1 1\\
1 1\\
1 1\\
0.990942028985507 1\\
0.919466403162056 1\\
0.750101951188908 1\\
0.543799799234582 1\\
0.392296411318151 0.958333333333333\\
0.29586627140975 0.958333333333333\\
0.227355072463768 0.916666666666667\\
0.181159420289855 0.875\\
0.148962450592885 0.791666666666667\\
0.106966403162055 0.75\\
0.0707345191040843 0.75\\
0.039937417654809 0.708333333333333\\
0.0271739130434783 0.666666666666667\\
0.0145750988142293 0.625\\
0.00543478260869565 0.541666666666667\\
0.00181159420289855 0.5\\
0 0.375\\
0 0.333333333333333\\
0 0.291666666666667\\
0 0.25\\
0 0.25\\
0 0.25\\
0 0.25\\
0 0.166666666666667\\
0 0.166666666666667\\
0 0.125\\
0 0.125\\
0 0.125\\
0 0.125\\
0 0.125\\
0 0.125\\
0 0.125\\
0 0.125\\
0 0.125\\
0 0.0833333333333333\\
0 0.0416666666666667\\
0 0.0416666666666667\\
0 0.0416666666666667\\
0 0.0416666666666667\\
0 0.0416666666666667\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
0 0\\
}\mydata
\begin{document}
\begin{tikzpicture}
\begin{axis}[%
width=4.521in,
scale = 0.6,
height=3.566in,
at={(0.758in,0.481in)},
scale only axis,
separate axis lines,
every outer x axis line/.append style={black},
every x tick label/.append style={font=\color{black}},
xmin=-0.1,
xmax=1.1,
xtick={-0.1, 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1},
xminorticks=true,
xlabel={FAR},
every outer y axis line/.append style={black},
every y tick label/.append style={font=\color{black}},
ymin=-0.1,
ymax=1.2,
ytick={-0.1, 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2},
yminorticks=true,
ylabel={TPR},
axis background/.style={fill=white},
]
\fill [blue!10!white,rounded corners] (axis cs:0,0) rectangle (axis cs:1,1);
\addplot [color=blue,solid,mark=o,mark options={solid},forget plot] %only marks
table {\mydata};
% change the number 10 (row number in table) to select a different marker
\pgfplotstablegetelem{10}{[index]0}\of{\mydata}
\pgfmathsetmacro{\myX}{\pgfplotsretval}
\pgfplotstablegetelem{10}{[index]1}\of{\mydata}
\pgfmathsetmacro{\myY}{\pgfplotsretval}
\node[draw,align=left] (textbox) at (rel axis cs:0.5,0.5) {here\\ test \\ $f(x)=\int\sin x\,\mathrm{d}x$};
\draw[->,shorten >=2mm] (textbox) -- (axis cs:\myX,\myY) node[draw,circle,red,inner sep=0pt,minimum size=7pt,very thick]{};
\end{axis}
\end{tikzpicture}%
\end{document}