
Почему следующий код рисует наклонную линию? Я думал, что сумма ($(1,6) + (2,0)$) вернет точку (3,6).
\documentclass[dvipsnames]{article}
\usepackage[utf8]{inputenc}
\usepackage{xcolor}
\usepackage{pgfplots,tikz}
\usetikzlibrary{babel,calc,backgrounds,quotes,angles,patterns,decorations.markings,intersections,arrows,arrows.meta}
\pgfplotsset{compat=newest}
\usepgflibrary{arrows}
\usepgfplotslibrary{fillbetween}
\begin{document}
\begin{tikzpicture}
\begin{axis}[ axis lines = middle,
xmin = -1,
ymin = -5,
xmax = 10,
ymax = 14,
domain = -1:10,
xtick = {1,2,...,9},
ytick = \empty,
xlabel style={below right},
ylabel style={above left},
x tick label style={below},
samples = 100,
axis on top=true,
xlabel = {$x$},
ylabel = {$f$}
]
\addplot[very thick, domain=0:11] {5 + x};
\draw[thick, dashed] (1,6) -- ($(1,6) + (2,0)$);
\end{axis}
\end{tikzpicture}
\end{document}
Результат:
Заранее спасибо!
решение1
Из документации pgfplots:
Чтобы выразить относительные положения (или длины), необходимо использовать направление оси cs.
Итак, вам придется использовать:
\draw[thick, dashed] (1,6) -- ($(1,6) + (axis direction cs:2,0)$);
Пример:
\documentclass[dvipsnames]{article}
%\usepackage[utf8]{inputenc}% need for outdated TeX distributions
\usepackage{pgfplots}% loads tikz and xcolor
\pgfplotsset{compat=newest}
\usetikzlibrary{babel,calc,backgrounds,quotes,angles,patterns,decorations.markings,intersections,arrows,arrows.meta}
\usepgfplotslibrary{fillbetween}
\begin{document}
\begin{tikzpicture}
\begin{axis}[ axis lines = middle,
xmin = -1,
ymin = -5,
xmax = 10,
ymax = 14,
domain = -1:10,
xtick = {1,2,...,9},
ytick = \empty,
xlabel style={below right},
ylabel style={above left},
x tick label style={below},
samples = 100,
axis on top=true,
xlabel = {$x$},
ylabel = {$f$}
]
\addplot[very thick, domain=0:11] {5 + x};
\draw[thick, dashed] (1,6) -- ($(1,6) + (axis direction cs:2,0)$);
\end{axis}
\end{tikzpicture}
\end{document}
Объяснение
Внутри оси координаты axis cs
по умолчанию используют .
Из документации:
Эффект
axis cs
заключается в применении любых пользовательских преобразований (включаяsymbolic x coords
), логарифмов, преобразований масштабирования данных или любых других действий, которые обычно выполняет pgfplots, и в качестве результата выдает низкоуровневую pgf-координату.
Координата pgf низкого уровня относится к координате (rel axis cs:0,0)
. Это нижний левый угол области оси (а не начало координат оси). Поэтому axis cs
координаты являются абсолютными позициями на оси. Если вы их сложите, то получите неожиданный результат:
Код:
\documentclass[dvipsnames]{article}
%\usepackage[utf8]{inputenc}% need for outdated TeX distributions
\usepackage{pgfplots}% loads tikz and xcolor
\pgfplotsset{compat=newest}
\usetikzlibrary{babel,calc,backgrounds,quotes,angles,patterns,decorations.markings,intersections,arrows,arrows.meta}
\usepgfplotslibrary{fillbetween}
\tikzset{point/.style={circle,fill=black,inner sep=1pt},>=latex'}
\begin{document}
\begin{tikzpicture}
\begin{axis}[ axis lines = middle,
xmin = -1,
ymin = -5,
xmax = 10,
ymax = 14,
domain = -1:10,
xtick = {1,2,...,9},
ytick = \empty,
xlabel style={below right},
ylabel style={above left},
x tick label style={below},
samples = 100,
axis on top=true,
xlabel = {$x$},
ylabel = {$f$},
]
\addplot[very thick, domain=0:11] {5 + x};
\path
(1,6) coordinate(P) node[point,label=above:P]{}
(2,0) coordinate(Q) node[point,label=above left:Q]{}
(rel axis cs:0,0) node{x}
;
\draw[blue!50!black] (1,6) -- ($(1,6) + (2,0)$);
\end{axis}
\path (0,0) coordinate(O) node[point,label=below:O]{};% origin of the rel axis cs
\begin{scope}[->,red]
\draw (O)--(P);
\draw (O)--(Q);
\draw (Q)--+(P)node[point]{};
\end{scope}
\end{tikzpicture}
\end{document}
Это можно исправить с помощью
\draw[thick, dashed] (1,6) -- ($(1,6) + (axis direction cs:2,0)$);
или
\draw[thick,dashed] (1,6) -- ($(1,6) + (2,0)-(0,0)$);
Код:
\documentclass[dvipsnames]{article}
%\usepackage[utf8]{inputenc}% need for outdated TeX distributions
\usepackage{pgfplots}% loads tikz and xcolor
\pgfplotsset{compat=newest}
\usetikzlibrary{babel,calc,backgrounds,quotes,angles,patterns,decorations.markings,intersections,arrows,arrows.meta}
\usepgfplotslibrary{fillbetween}
\tikzset{point/.style={circle,fill=black,inner sep=1pt},>=latex'}
\begin{document}
\begin{tikzpicture}
\begin{axis}[ axis lines = middle,
xmin = -1,
ymin = -5,
xmax = 10,
ymax = 14,
domain = -1:10,
xtick = {1,2,...,9},
ytick = \empty,
xlabel style={below right},
ylabel style={above left},
x tick label style={below},
samples = 100,
axis on top=true,
xlabel = {$x$},
ylabel = {$f$},
clip=false
]
\addplot[very thick, domain=0:11] {5 + x};
\draw[thick,blue!50!black] (1,6) -- ($(1,6) + (2,0)$);
\draw[thick,green!50!black] (1,6) -- ($(1,6) + (2,0)-(0,0)$);
\draw[thick,dashed] (1,6) -- ($(1,6) + (axis direction cs:2,0)$);
%
\path
(rel axis cs:0,0) coordinate(O) node[point,label=below:O]{}
(0,0) coordinate(A) node[point,label=above left:A]{}
(1,6) coordinate(P) node[point,label=above:P]{}
(2,0) coordinate(Q) node[point,label=above left:Q]{}
;
\begin{scope}[->,red]
\draw[thick,dotted,cyan] (A)--(O);
\draw (O)--(P);
\draw (O)--(Q);
\draw (Q)--+(P)node[point]{};
\draw[thick,cyan] (Q) ++(P)-- +($(O)-(A)$)node[point]{};
\end{scope}
\end{axis}
\end{tikzpicture}
\end{document}
решение2
Для лучшего понимания того, что происходит, координата (ось cs: 2,0) - это расстояние от (ось rel cs: 0,0). а не (ось cs: 0,0). Дополнительные 5 в направлении y берутся из [ymin=-5].
\documentclass[dvipsnames]{article}
\usepackage[utf8]{inputenc}
\usepackage{xcolor}
\usepackage{pgfplots,tikz}
\usetikzlibrary{babel,calc,backgrounds,quotes,angles,patterns,decorations.markings,intersections,arrows,arrows.meta}
\pgfplotsset{compat=newest}
\usepgflibrary{arrows}
\usepgfplotslibrary{fillbetween}
\begin{document}
\begin{tikzpicture}
\begin{axis}[ axis lines = middle,
xmin = -1,
ymin = -5,
xmax = 10,
ymax = 14,
domain = -1:10,
xtick = {1,2,...,9},
ytick = \empty,
xlabel style={below right},
ylabel style={above left},
x tick label style={below},
samples = 100,
axis on top=true,
xlabel = {$x$},
ylabel = {$f$}
]
\addplot[very thick, domain=0:11] {5 + x};
\coordinate (A) at (1,6);% axis cs: is the default
\coordinate (B) at (2,0);
\coordinate (origin) at (0,0);
\end{axis}
\draw[thick, dashed] (A) -- ($(A) + (B) - (origin)$);
\end{tikzpicture}
\end{document}