可视化图形的相对位置以便进行构图

可视化图形的相对位置以便进行构图

我经常利用通过根据相对位置添加节点来注释我的图表。对于一个相当简单的线性图,经过几次猜测后,我找到了我想要放置注释的正确位置。

但我经常与半对数轴绘图并且很难在图表上找到例如我的(光学) 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}

渲染图 1

这是重要的使用足够的sample步骤来获得用于定位pin或标签的精确数据点。否则,pinlabel将被放置在请求参数可用的下一个数据点when。这不必完全是您请求的值。

这里渲染的输出是用samples 10而不是samples 250

渲染图 2

如果你使用style={mark=*}myfunc={...}你可以标记每个可用的数据点。这更好地展示了样本不足的问题:

渲染图像2.1

更新: 您还可以将圆形节点添加到图形中。请参阅以下代码以获取示例(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}

渲染图 3

相关内容