我经常利用pgf图通过根据相对位置添加节点来注释我的图表。对于一个相当简单的线性图,经过几次猜测后,我找到了我想要放置注释的正确位置。
但我经常与半对数轴绘图并且很难在图表上找到例如我的(光学) x 轴的三分之一,正如您在 MWE 中所看到的那样。
我知道有办法将节点放置在图上的准确位置,但这通常并不简单。我只是在寻找一个快速且简单放置节点的方法 - 使用pos=...
属性是实现该目的的最佳方式。所以我想知道是否可以在图形顶部放置一个“相对网格”来进行组合。
平均能量损失
\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{semilogxaxis}[
width = \linewidth,
]
\addplot {x^2}
node[pos=0.3, fill, circle=10pt, pin=135:{ annotation in graph color }] {0.5}
node[pos=0.5, fill, circle=10pt, color=red, text=black] {0.5}
node[pos=0.2, fill, circle=10pt, color=red, text=black] {0.2}
;
\end{semilogxaxis}
\end{tikzpicture}
\end{document}
当然,我可以使用循环绘制多个红点来了解图表上的位置,但我想知道是否有更简洁的解决方案。
答案1
pos
您可以使用循环自动添加不同值的节点foreach
,然后可用于查找所需的位置:
\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\newcommand\showpos{
foreach \pos in {0, 0.1, ..., 1} {node [pos=\pos, pin=\pgfmathprintnumber{\pos}, circle, inner sep=1pt, fill] {} }
}
\begin{tikzpicture}
\begin{semilogxaxis}[
width = \linewidth,
]
\addplot [green!50!blue] {x^2} \showpos node[pos=0.15, fill, circle=10pt, pin=135:{ annotation in graph color }] {0.15};
\end{semilogxaxis}
\end{tikzpicture}
\end{document}
答案2
借助该datavisualization
库,您可以使用when
键来指定何时在图表上放置标签或图钉。您可以通过调用when=<x|y> is <value>
或pin in data
命令来使用它label in data
。
\documentclass[tikz, border=5mm]{standalone}
\usetikzlibrary{datavisualization.formats.functions}
\begin{document}
\begin{tikzpicture}
\datavisualization[scientific axes,
x axis={grid={step=.5}, logarithmic},
visualize as line=myfunc,
every data set label/.append style={
text colored,
node style={font=\scriptsize}
},
style sheet=vary hue,
myfunc={
label in data={text={$f(x)=x^2$}, when=x is .25},
pin in data={text={$x=1$}, when=x is 1},
pin in data={text={$x=4$}, when=x is 4},
pin in data={text={$y=60$}, when=y is 60},
}]
data [format=function, set=myfunc] {
var x : interval [0.1:10] samples 250;
func y = \value x * \value x;
};
\end{tikzpicture}
\end{document}
这是重要的使用足够的sample
步骤来获得用于定位pin
或标签的精确数据点。否则,pin
或label
将被放置在请求参数可用的下一个数据点when
。这不必完全是您请求的值。
这里渲染的输出是用samples 10
而不是samples 250
。
如果你使用style={mark=*}
,myfunc={...}
你可以标记每个可用的数据点。这更好地展示了样本不足的问题:
更新:
您还可以将圆形节点添加到图形中。请参阅以下代码以获取示例(second label in data
):
\documentclass[tikz, border=5mm]{standalone}
\usetikzlibrary{datavisualization.formats.functions}
\begin{document}
\begin{tikzpicture}
\datavisualization[scientific axes,
x axis={grid={step=.5}, logarithmic},
visualize as line=myfunc,
every data set label/.append style={
text colored,
node style={font=\scriptsize}
},
style sheet=vary hue,
myfunc={
label in data={text={$f(x)=x^2$}, when=x is .25},
pin in data={text={$x=1$}, when=x is 1},
pin in data={text={$x=4$}, when=x is 4},
pin in data={text={$y=60$}, when=y is 60},
label in data={text=$5$ , when=x is 5, node style={fill=red, circle, anchor=center}},
}]
data [format=function, set=myfunc] {
var x : interval [0.1:10] samples 250;
func y = \value x * \value x;
};
\end{tikzpicture}
\end{document}