pgfplots

pgfplots

У меня есть линии сетки, нарисованные на декартовой плоскости. Я отмечаю расстояния 2, 4, 6, и 8вдоль оси x и 2вдоль оси y. Чтобы избежать рисования линий сетки поверх этих меток, я использую fill=whiteи inner sep=0.15в параметрах для команд узлов. Мне кажется, что на дисплее метки не окружены пробелами 0.15cm. Как мне получить требуемое пустое пространство, не перемещая метки?

\documentclass{amsart}
\usepackage{amsmath}
\usepackage{amsfonts}

\usepackage{tikz}
\usetikzlibrary{calc}

\begin{document}

\begin{tikzpicture}

%Horizontal grid lines are drawn.
\draw[dashed,gray!50] (-0.75,-0.5) -- (4.25,-0.5);
\draw[dashed,gray!50] (-0.75,0) -- (4.25,0);
\draw[dashed,gray!50] (-0.75,0.5) -- (4.25,0.5);
\draw[dashed,gray!50] (-0.75,1) -- (4.25,1);
\draw[dashed,gray!50] (-0.75,1.5) -- (4.25,1.5);

%Vertical grid lines are drawn.
\draw[dashed,gray!50] (-0.5,-0.75) -- (-0.5,1.75);
\draw[dashed,gray!50] (0,-0.75) -- (0,1.75);
\draw[dashed,gray!50] (0.5,-0.75) -- (0.5,1.75);
\draw[dashed,gray!50] (1,-0.75) -- (1,1.75);
\draw[dashed,gray!50] (1.5,-0.75) -- (1.5,1.75);
\draw[dashed,gray!50] (2,-0.75) -- (2,1.75);
\draw[dashed,gray!50] (2.5,-0.75) -- (2.5,1.75);
\draw[dashed,gray!50] (3,-0.75) -- (3,1.75);
\draw[dashed,gray!50] (3.5,-0.75) -- (3.5,1.75);
\draw[dashed,gray!50] (4,-0.75) -- (4,1.75);


%Some distances from the origin along the axes are labeled.
\node[fill=white, anchor=north, inner sep=0.15, font=\tiny] at ($(1,0) +(0,-0.15)$){2};
\node[fill=white, anchor=north, inner sep=0.15, font=\tiny] at ($(2,0) +(0,-0.15)$){4};
\node[fill=white, anchor=north, inner sep=0.15, font=\tiny] at ($(3,0) +(0,-0.15)$){6};
\node[fill=white, anchor=north, inner sep=0.15, font=\tiny] at ($(4,0) +(0,-0.15)$){8};

\node[fill=white, anchor=east, inner sep=0.15, font=\tiny] at ($(0,1) +(-0.15,0)$){2};


%The axes are drawn.
\draw[latex-latex] (-1,0) -- (4.5,0);
\draw[latex-latex] (0,-1) -- (0,2);
\node [anchor=north west] at (4.5,0) {$x$};
\node [anchor=south west] at (0,2) {$y$};


%A path is drawn.
\draw (0,-0.5) -- (1,0.5) -- (1.5,0) -- (2,1) -- (3,1) -- (3.5,0.5) -- (4,1.5);

\end{tikzpicture}

\end{document}

решение1

Этот ответ предлагает два решения: одно с pgfplotsи одно с tikz.

pgfplots

Это было бы гораздо проще сделать pgfplots, вам не нужно было бы рисовать все вручную.

Выход

введите описание изображения здесь

Код

\documentclass{amsart}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{pgfplots}

\pgfplotsset{compat=1.13}

\begin{document}
\begin{tikzpicture}
\begin{axis}[
    xmin=-1, xmax=9,
    ymin=-1, ymax=2,
    axis equal,
    minor y tick num=1,
    minor x tick num=1,
    yticklabel style={font=\scriptsize, fill=white},
    xticklabel style={font=\scriptsize, fill=white},
    axis lines=center, no markers,
    grid=both, grid style={dashed,gray,very thin},
    xlabel={$x$},
    ylabel={$y$},
]

\plot[black,thick] coordinates {(0,-1) (2,1) (3,0) (4,2) (6,2) (7,1) (8,3)};
\end{axis}
\end{tikzpicture}
\end{document}

tikz

Если вы хотите продолжать использовать TikZ, вот альтернативная версия. Ваша проблема в том, что вы сказали, inner sep=0.15но не указали тип измерения. Попробуйте написать inner sep=0.15cm, и вы увидите разницу.

Выход

введите описание изображения здесь

Код

\documentclass[margin=10pt]{standalone}%{amsart}
\usepackage{amsmath}
\usepackage{amsfonts}

\usepackage{tikz}
\usetikzlibrary{calc}

\newcommand\myshift{.10}
\newcommand\xmax{5}
\newcommand\ymax{2.5}

\begin{document}
\begin{tikzpicture}

% axes + grid
\draw[step=5mm,gray,dashed, line width=.2pt] ({\xmax-5.75},{\ymax-3.75}) grid ({\xmax-.25},{\ymax-.25});
\draw[latex-latex] (-1,0) -- (\xmax,0) node[font=\tiny, right] {$x$};
\draw[latex-latex] (0,{\ymax-4.25}) -- (0,\ymax)   node[font=\tiny, above] {$y$};

% x tick labels
\foreach \label [count=\xx] in {2,4,6,8}{%
    \node[fill=white, anchor=north, inner sep=\myshift cm, font=\tiny] at (\xx,0) {\label};
}

% y tick labels
\foreach \label [evaluate=\label as \yy using int(\label/2)] in {-2,2,4}{%
    \node[fill=white, anchor=east, inner sep=\myshift cm, font=\tiny] at (0,\yy) {\label};
}

%A path is drawn.
\draw (0,-0.5) -- (1,0.5) -- (1.5,0) -- (2,1) -- (3,1) -- (3.5,0.5) -- (4,1.5);

\end{tikzpicture}
\end{document}

решение2

Я могу себе представить, почему вы, возможно, захотите придерживаться синтаксиса TikZ из соображений уверенности, знакомства и т. д., но я бы все равно рекомендовал использовать его или, по крайней мере, собственную библиотеку pgfplotsTikZ .graphdrawing

В любом случае, для вопросов о внутреннем и внешнем разделении, возможно, визуализация могла бы помочь.

Содержимое узла помещается в заполнитель ( среду \hboxили ) minipage, а затем TikZ измеряет высоту и ширину этого заполнителя, чтобы нарисовать форму узла. inner sepдобавляется к этому измерению.

outer sepэто своего рода та же идея, но работает по-другому. Когда вы хотите разместить что-то рядом с ним или провести линию к/от этого узла или просто разместить сам узел, упомянув якоря границы, он вычисляет точку на границе, а затем отводит outer sepмного точек от узла.

\begin{tikzpicture}
\node[draw,outer sep=1cm,inner sep=1cm] (a){\fbox{Contents}} ;

\draw[|-|,thick,red] (a.south) node[below,black]{Here is south anchor} 
    --++(0,1cm) node[midway,right]{1cm (outer sep)};
\draw[|-|,thick,red] (a.south) ++(0,1cm) 
    --++(0,1cm)node[midway,right]{1cm (inner sep)};
\node[text width=1.5cm,align=right,inner sep=0,outer sep=0,draw,left] 
    (b) at(a.west) {a relative placed node};
\draw[|-|,blue,thick] (b.east) -- ++(1cm,0);
\end{tikzpicture}

введите описание изображения здесь

Как вы видите, отступ теперь немного более заметен. Теперь, когда вы привязываете свои метки, внешний разделитель толкает их вниз, как вы уже видели. Но привязка не обязательно должна быть абсолютной, вы все равно можете подталкивать вещи через:

\begin{tikzpicture}
\node[outer sep=0cm,inner sep=0cm] (O){O} ;
\node[outer sep=1cm,inner sep=1cm,draw,anchor=north,yshift=1cm] at (O) {Node};
\end{tikzpicture}

введите описание изображения здесь

Мы видим, что даже если якорь установлен на север, мы все равно можем перемещать вещи, и якорь по-прежнему соблюдается.

решение3

Альтернативное возможное решение с TikZ:

введите описание изображения здесь

Он генерируется следующим (на мой взгляд, очень лаконичным) кодом:

\documentclass{amsart}
    \usepackage{amsmath,amssymb}
    \usepackage{tikz}
    \usetikzlibrary{arrows,calc,positioning}
% for show only a picture
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}
    \setlength\PreviewBorder{5mm}

\begin{document}
    \begin{tikzpicture}[
    x=5mm,  y=5mm,
AL/.style = {% Axis Labels 
   fill=white, inner sep=0.5mm, font=\tiny} 
                        ]
% grid
\draw[gray,dashed,very thin] (-1,-3) grid[step=1] (9,5); 
% x tick labels
\foreach \x in {2,4,6,8}
    \node[AL,below=1mm] at (\x,0) {\x}; 
% y tick labels
\foreach \y in {-2,2,4}
\node[AL,left=1mm] at (0,\y) {\y};
% x and y axes
\draw[latex-latex] (-1,0) -- (9,0) node[AL,below left=1mm and 0mm] {$x$};
\draw[latex-latex] (0,-3) -- (0,5) node[AL,below left=0mm and 1mm] {$y$};
% curve
\draw[red, very thick]
    (0,-1) -- (2,1) -- (3,0) -- 
    (4, 2) -- (6,2) -- (7,1) -- (8,3);
    \end{tikzpicture}
\end{document}

В коде выше я использую:

  • Сетка для рисования сетки графика. При выборе step=5mmопределяются расстояния между линиями сетки. Она равна размеру xи yединицам для расстояний в этих направлениях.
  • Стиль для метки x и y определяется в tikzpictureпараметрах. Для inner sep, т.е. расстояние междутекст в узлеиграница узла, я выбираю 0,5 мм. В его позиционировании я выбираю, чтобы узлы находились на расстоянии 1 мм от оси, поэтому расстояние между ними и числами равно сумме обоих расстояний (1,5 мм).

решение4

\documentclass{amsart}
\usepackage{amsmath}
\usepackage{amsfonts}

\usepackage{tikz}
\usetikzlibrary{calc,angles,positioning,intersections,quotes,decorations.markings,decorations.pathreplacing}

\begin{document}

\begin{tikzpicture}

% axes + grid
\draw[step=5mm,gray,dashed, line width=0.2pt] (-0.75,-1.25) grid (4.25,2.25);
\draw[latex-latex] (-1,0) -- (5,0) node[font=\tiny, right] {$x$};
\draw[latex-latex] (0,-1.75) -- (0,2.5)   node[font=\tiny, above] {$y$};

% x tick labels
\foreach \label [count=\xx] in {2,4,6,8}
{\node[fill=white, anchor=north, inner sep=0.1cm, font=\tiny] at (\xx,0) {\label};}

% y tick labels
\foreach \label [evaluate=\label as \yy using int(\label/2)] in {-2,2,4}
{\node[fill=white, anchor=east, inner sep=0.1cm, font=\tiny] at (0,\yy) {\label};}

%A path is drawn.
\draw (0,-0.5) -- (1,0.5) -- (1.5,0) -- (2,1) -- (3,1) -- (3.5,0.5) -- (4,1.5);

\end{tikzpicture}

\end{document}

Связанный контент