Tikz,PGFplots:在放置在图上的节点的 cs 中绘图

Tikz,PGFplots:在放置在图上的节点的 cs 中绘图

我正在尝试放置一些箭头,这些箭头应该放在图表旁边。我使用

node[pos=0.2,above] (point1) {} 

然后我想在该坐标系中绘制

\draw [->] (node cs:name=point1,anchor=north) -- (0,1);

但这根本不起作用。

完整代码如下:

\begin{tikzpicture}
\tikzexternaldisable
\begin{axis}[xlabel=$\lambda$,ylabel=$M_R$
domain=0:50,
width=12cm,
height=8cm,
ytick=\empty
]
\addplot[smooth,black] table[x=lam,y expr=\thisrow{ct}] {bilder/mr/ct.out} node[pos=0.6]{};
\addplot[smooth,black] table[x=lam,y expr=\thisrow{ct}*2] {bilder/mr/ct.out}
 node[pos=0.2,circle,fill=black,scale=0.3] (point1) {}  
 node[pos=0.6,circle,fill=black,scale=0.3] (point1) {};
\addplot[smooth,black] table[x=lam,y expr=\thisrow{ct}*4] {bilder/mr/ct.out} node[pos=1, above] {$W$} node[pos=1,xshift=12pt,yshift=-10pt] (v1) {} ;
\draw (node cs:name=a1,anchor=north) [->]  (0,0) -- (0,1);

\end{axis}
\end{tikzpicture}

ct.out 如下所示:

    lam ct  cp
0.4 0.012360489 0.004944196
0.8 0.020495909 0.016396727
1   0.027456016 0.027456016
1.2 0.039743915 0.047692698
1.5 0.062400877 0.093601316
1.7 0.08363738  0.142183546
1.9 0.10823897  0.205654043
2   0.11533637  0.23067274
2.1 0.11622777  0.244078317
2.3 0.11317585  0.260304455
2.5 0.10662368  0.2665592
3   0.087667927 0.263003781
3.5 0.069310704 0.242587464
4   0.0525382   0.2101528
5   0.0262106   0.131053
6   0.003988099 0.023928596

箭头应该是这样的 箭头应该是这样的

答案1

这不是一个完美的解决方案,但你可以从以下方法开始:

\documentclass{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
%\tikzexternaldisable
\begin{axis}[xlabel=$\lambda$,ylabel=$M_R$
domain=0:50,
width=12cm,
height=8cm,
ytick=\empty
]
\addplot[smooth,black] table[x=lam,y expr=\thisrow{ct}] {ct.out} node[pos=0.6]{};
\addplot[smooth,black] table[x=lam,y expr=\thisrow{ct}*2] {ct.out}
 coordinate[pos=0.1] (point00) 
 node[pos=0.2,circle,fill=black,scale=0.3] (point1) {}
 coordinate[pos=0.2] (point01) 
 coordinate[pos=0.25] (point02)  
 node[pos=0.6,circle,fill=black,scale=0.3,outer sep=1mm] (point2) {};
\addplot[smooth,black] table[x=lam,y expr=\thisrow{ct}*4] {ct.out} node[pos=1, above] {$W$} node[pos=1,xshift=12pt,yshift=-10pt] (v1) {} ;
\draw[<-,blue,thick,shorten >=2mm] ([yshift=2mm]point00) -- ([yshift=2mm]point01);
\draw[->,blue,thick] ([yshift=2mm]point01) -- ([yshift=2mm]point02);
\draw[->,red,thick] (point2.north east) --++(-25:1cm); 
\draw[->,red,thick] (point2.north) --++(150:2cm); 
\end{axis}
\end{tikzpicture}
\end{document}

您可以在两点之间绘制箭头(蓝色箭头)或使用相对坐标(红色箭头)。语法为++(increment x, increment y)or ++(angle:length)。设置outer sepfor point1and point2(如 Altermundus 所建议的)可避免需要 for yshift

结果是

在此处输入图片描述

答案2

1)添加...outer sep=6pt] (point1) {}

2)\draw[blue,thick,->] ([yshift=1pt]point1.90 ) -- ++(10,20); 我手动放置箭头([yshift=1pt]point1.90),您可以使用.90.north [yshift=1pt]用于对齐箭头。

在此处输入图片描述

\documentclass{article}
\usepackage{pgfplots}
\begin{document}

\begin{tikzpicture}
\begin{axis}[xlabel=$\lambda$,ylabel=$M_R$
domain=0:50,
width=12cm,
height=8cm,
ytick=\empty
]
\addplot[smooth,black] table[x=lam,y expr=\thisrow{ct}] {ct.out} node[pos=0.6]{};
\addplot[smooth,black] table[x=lam,y expr=\thisrow{ct}*2] {ct.out}
 node[pos=0.2,circle,fill=black,scale=0.3,outer sep=6pt] (point1) {}  
 node[pos=0.6,circle,fill=black,scale=0.3] (point2) {};
\addplot[smooth,black] table[x=lam,y expr=\thisrow{ct}*4] {ct.out} node[pos=1, above] (a1){$W$} node[pos=1,xshift=12pt,yshift=-10pt] (v1) {} ;
\draw[blue,thick,->] ([yshift=1pt]point1.90 )  -- ++(10,20);  
\draw[blue,thick,->] (point1.180)  -- ++(-10,-20); 
\end{axis}
\end{tikzpicture}
\end{document} 

答案3

这里有一个开始另一种方法还有很大的改进空间,但我认为它在数据更密集的情况下会很有效。

这里我定义了一个宏\DrawArrows,它restrict x to domain试图使用跟随曲线并绘制箭头沿着曲 线。

在此处输入图片描述

笔记:

  • 这种方法的一个缺点是必须有该点所在 x 坐标的数据。
  • 我相信如果有更多可用数据,这个案例将会很有效。
  • 最初,我只有两个坐标参数:xdelta x,但由于数据很少,因此无法产生很好的结果。因此,我将其扩展为明确提供三个点:x-leftxx-right以便可以分别进行调整。

进一步增强:

  • 也许使用该库可以找到更好的解决方案tikz decorations
  • 这个问题是关于如何提高通用曲线沿着另一条路径可能有助于调整此解决方案以正确处理上图中红色箭头的情况。

代码:

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

\begin{filecontents*}{ct.out}
    lam ct  cp
0.4 0.012360489 0.004944196
0.8 0.020495909 0.016396727
1   0.027456016 0.027456016
1.2 0.039743915 0.047692698
1.5 0.062400877 0.093601316
1.7 0.08363738  0.142183546
1.9 0.10823897  0.205654043
2   0.11533637  0.23067274
2.1 0.11622777  0.244078317
2.3 0.11317585  0.260304455
2.5 0.10662368  0.2665592
3   0.087667927 0.263003781
3.5 0.069310704 0.242587464
4   0.0525382   0.2101528
5   0.0262106   0.131053
6   0.003988099 0.023928596
\end{filecontents*}

\newcommand*{\DrawArrows}[6]{%
    % #1 = addplot options (controls arrow and line)
    % #2 = table options
    % #3 = data file
    % #4 = x coordinate of left point
    % #5 = x coordinate of point
    % #6 = x coordinate of right point
    \addplot [draw=none] 
        table[restrict x to domain=#5:#5, #2] {#3}
        node[circle,fill=black,scale=0.3,outer sep=6pt] {};
    
    \addplot[shorten <=1pt, ->, #1] 
        table[restrict x to domain=#5:#6, #2] {#3};

    \addplot[shorten >=1pt, <-, #1] 
        table[restrict x to domain=#4:#5, #2] {#3};
}%

\begin{document}

\begin{tikzpicture}
\begin{axis}[xlabel=$\lambda$,ylabel=$M_R$
domain=0:50,
width=12cm,
height=8cm,
ytick=\empty
]
\addplot[smooth,black] table[x=lam,y expr=\thisrow{ct}] {ct.out} node[pos=0.6]{};
\addplot[smooth,black] table[x=lam,y expr=\thisrow{ct}*2] {ct.out}
% node[pos=0.2,circle,fill=none,scale=0.3,outer sep=6pt] (point1) {}  
% node[pos=0.6,circle,fill=black,scale=0.3] (point2) {}
;
\addplot[smooth,black] table[x=lam,y expr=\thisrow{ct}*4] {ct.out} node[pos=1, above] (a1){$W$} node[pos=1,xshift=12pt,yshift=-10pt] (v1) {} ;


%---------------
\DrawArrows
    {brown, ultra thick, xshift=-1.5pt, yshift=1.5pt}% addplot options
    {x=lam,y expr=\thisrow{ct}*2}%   table options
    {ct.out}%                        data file
    {1.2}{1.5}{1.8}% x coordinates: left point, middle, right point

\DrawArrows
    {blue, ultra thick, xshift=1.0pt, yshift=2.0pt}% addplot options
    {x=lam,y expr=\thisrow{ct}*2}%   table options
    {ct.out}%                        data file
    {3.0}{3.5}{4.0}% x coordinates: left point, middle, right point

\DrawArrows
    {red, ultra thick, xshift=-2pt, yshift=1pt}% addplot options
    {x=lam,y expr=\thisrow{ct}*4}%   table options
    {ct.out}%                        data file
    {1.7}{1.9}{3.0}% x coordinates: left point, middle, right point

\end{axis}
\end{tikzpicture}
\end{document} 

相关内容