我正在尝试用 tikz 绘制一个简单的图形:
感谢您的帮助
这是我目前所拥有的:
%\documentclass[tikz]{standalone}
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw[very thick,->] (0,0) -- (10,0);
\draw[blue!80,fill=blue!50] (2,0) circle (.2cm);
\draw[blue!80,fill=blue!50] (4,0) circle (.2cm);
\draw[blue!80,fill=blue!50] (6,0) circle (.2cm);
\draw[blue!80,fill=blue!50] (8,0) circle (.2cm);
\end{tikzpicture}
\end{document}
答案1
如果将圆圈画为圆形节点,那么可以使用label
语法将标签放在它们的上方和下方。
\documentclass[border=5pt, multi, tikz]{standalone}
让我们加载一些更精美的箭头来改进当前的箭头。
\usetikzlibrary{arrows.meta}
\begin{document}
\begin{tikzpicture}
如果我们要将圆圈画为节点,那么定义一个具有所需设置的标准样式是有意义的,以避免重复相同的设置,并且在需要时更容易修改它们。
[
my blue/.style={blue!80, fill=blue!50, minimum width=4mm, circle, inner sep=0pt},
这应该绘制出圆形节点,看起来很像circle
原始代码中定义的 s。
我们希望没有文字,因此让我们为图片设置文字。
font=\sffamily
]
我们像以前一样开始,但是我们用一个更奇特的箭头代替普通的箭头-{Stealth[]}
。
\draw[very thick,-{Stealth[]}] (0,0) -- (10,0)
我们可以使用以下方法分别放置每个节点
\node [my blue, label={[text=blue!80]above:<label>}, label={[text=blue!80]below:<label>}] at <location> {};
但这样需要输入很多内容,所以让我们使用循环来绘制我们想要的 4 个圆圈并放置标签。我们可以通过将 a 添加0
到步骤数来得出下部标签:10
、20
等等30
。因此,我们需要一个变量来存储上部标签 -\i
以及另一个变量来保持计数 -\n
比如说。然后我们的循环将如下所示:
foreach \i [count=\n] in {AA,BB,CC,DD}
{
node [pos=\n/5, my blue, label={[text=blue!80]above:\i}, label=below:\n 0] {}
}
如下图所示,每个节点的位置也是从 计算出来的\n
。因此,这是一种绘制圆圈并标记它们的非常有效的方法。
当我们在这里时,我们不妨在线的中间添加一个我们想要“f1”标记的坐标,但将此标记作为附加步骤添加会更容易。
coordinate [midway] (f1)
最后,我们在“temp”标签行的最右侧添加一个节点。
node [right] {temp};
现在我们只需要添加垂直标记和标签“f1”,我们将坐标放在(f1)
上面。我们可以使用语法使用相对坐标来执行此操作+
。如果我们向下绘制,则只需添加标签节点即可below
。
\draw [very thick] (f1) ++(0,2mm) -- (f1) -- ++(0,-2mm) node [below] {f\textsubscript{1}};
我们使用\textsubscript
而不是$f_1$
因为,这样,我们就可以按照需要保留无衬线字体。
\end{tikzpicture}
\end{document}
我们完成了!
完整代码:
\documentclass[border=5pt, multi, tikz]{standalone}
\usetikzlibrary{arrows.meta}
\begin{document}
\begin{tikzpicture}
[
my blue/.style={blue!80, fill=blue!50, minimum width=4mm, circle, inner sep=0pt},
font=\sffamily
]
\draw[very thick,-{Stealth[]}] (0,0) -- (10,0)
foreach \i [count=\n] in {AA,BB,CC,DD}
{
node [pos=\n/5, my blue, label={[text=blue!80]above:\i}, label=below:\n 0] {}
} coordinate [midway] (f1) node [right] {temp};
\draw [very thick] (f1) ++(0,2mm) -- (f1) -- ++(0,-2mm) node [below] {f\textsubscript{1}};
\end{tikzpicture}
\end{document}
编辑
我想添加以下方法,用一行 TikZ 代码生成图表。这使用decorations.markings
库代替依赖第二行 TikZ 代码。虽然我最初想过这样做,但我并不认为为了一行代码而费心是值得的。尽管如此,在提供了实现基本相同想法的代码后,我认为展示如何使用现有库来实现这一点可能会很有用。
除了删除第二条\draw
命令外,我们还可以删除 的坐标规范,因为(f1)
我们不需要它。相反,我们将节点和垂直线添加为,并将其作为decoration
应用于第一条命令。这意味着装饰被绘制\draw
postaction
也原来的线,正如我们想要的,而不是而不是它,就像我们简单地说一样decorate
。
所需的附加选项\draw
包括
postaction=decorate, decoration={markings, mark=at position .5 with {\arrow{|}\node [below, yshift=-1mm, anchor=north] {f\textsubscript{1}}; } }
的内容decoration
指定装饰的类型,markings
以及该装饰的设置。mark=at position .5
将其放在中间点并with {<stuff>}
指定要使用什么作为标记。库\arrow{<arrow tip>}
专门提供,decorations.markings
以便于使用箭头作为标记。然后,我们在其下方添加节点,并像以前一样稍微向下移动。
结果:
完整代码:
\documentclass[border=5pt, multi, tikz]{standalone}
\usetikzlibrary{arrows.meta,decorations.markings}
\begin{document}
\begin{tikzpicture}
[
my blue/.style={blue!80, fill=blue!50, minimum width=4mm, circle, inner sep=0pt},
font=\sffamily
]
\draw[very thick, -{Stealth[]}, postaction=decorate, decoration={markings, mark=at position .5 with {\arrow{|}\node [below, yshift=-1mm, anchor=north] {f\textsubscript{1}}; } }] (0,0) -- (10,0)
foreach \i [count=\n] in {AA,BB,CC,DD}
{
node [pos=\n/5, my blue, label={[text=blue!80]above:\i}, label=below:\n 0] {}
} node [right] {temp};
\end{tikzpicture}
\end{document}
答案2
你可以用以下语法修饰路径node [
地点] {
内容}
。 例如,地点可以是above
或right=10pt
。
\documentclass{article}
\usepackage{tikz}
% to reduce typing
\newcommand{\decor}[2]{node [above=10pt] {#1} node [below=10pt]
{\textcolor{black}{#2}}}
\begin{document}
\begin{tikzpicture}
\draw[very thick, ->] (0,0) -- (10,0) node [right] {temp};
\draw[blue!80,fill=blue!50] (2,0) circle (.2cm) \decor{AA}{10};
\draw[blue!80,fill=blue!50] (4,0) circle (.2cm) \decor{BB}{20};
\draw[blue!80,fill=blue!50] (6,0) circle (.2cm) \decor{CC}{30};
\draw[blue!80,fill=blue!50] (8,0) circle (.2cm) \decor{DD}{40};
\draw[very thick] (5,0.5) -- (5,-0.5) node [below] {\(f_1\)};
\end{tikzpicture}
\end{document}
答案3
你可以用循环来实现。以下是一些注释版本
\begin{tikzpicture}
\draw[very thick,-latex] (0,0) -- (8,0);% That arrow head is called 'latex'
\foreach \x % do things multiple times with index \x
[count=\xi] % when going through the list also count the index with \xi
in {A,...,D}{ % tikz understands alphabetical sequences
\node[fill=blue!10,circle,% give the node options
label={[text=blue!10]90:\x\x},% put the letters
label={[text=blue!10]270:\xi0},
inner sep=2mm%increase the size a bit
]
(n-\xi) % give a name
at (2*\xi-1,0) % place them at odd numbered x's
{}; % Nothing is written inside the disks
}
\end{tikzpicture}