Tikz-Diagram:如何定义箭头、直线和标签的相对位置

Tikz-Diagram:如何定义箭头、直线和标签的相对位置

今天我尝试重现几个经济图表。以下是相图的示例:

在此处输入图片描述

我想使用 tikzpicture 环境。但我不知道如何开始创建相对长度的轴,所以有类似的东西吗width=0.7\textwidth?如何定义这个 tikzpicture 的大小?相对于我的 A4 纸的大小还是像素大小更好?也许有人可以帮助创建普通图表轴和例如线\dot k以及一些关系位置点k^*

我是这样开始的:

\begin{center}
\begin{tikzpicture}[
    scale=5,
    axis/.style={very thick, ->, >=stealth'},
    important line/.style={thick},
    dashed line/.style={dashed, thin},
    pile/.style={thick, ->, >=stealth', shorten <=2pt, shorten
    >=2pt},
    every node/.style={color=black}
    ]
    \draw[axis] (-0.1,0)  -- (1.8,0) node(xline)[right] {$k_t \equiv \frac{K_t}{H_t}$};
    \draw[axis] (0,-0.1) -- (0,1.8) node(yline)[above] {$c_t \equiv \frac{C_t}{H_t}$};
    \draw[important line] (0.9,0.1) coordinate (C) -- (0.9,1.6)
        coordinate (C) node[above, text width=5em] {$\dot c = 0$};
\end{tikzpicture}
\end{center}

得出:在此处输入图片描述

这是对轴进行建模的好方法吗?我应该如何添加标签k^*?我必须记住我将 c 线置于 0.9 处?

更新:应用解决方案。

\begin{center}
\begin{tikzpicture}[scale=2]
\tikzset{every picture/.style=semithick}
\begin{axis}[
  axis lines=left,
  xmin=0,
  xmax=2.2,
  ymin=0,
  ymax=2.2,
  clip=false,
  xtick={\empty},
  ytick={\empty},
    xlabel=$\small k_t \equiv \frac{K_t}{H_t}$,
    xlabel style={at={(current axis)}, yshift=-5.8cm, xshift=0.3cm},
    ylabel=$\small c_t \equiv \frac{C_t}{H_t}$,
    ylabel style={at={(current axis.north west)},rotate=-90,yshift=-19em, xshift=0.5cm},
]
\tiny % scale up entire tikz, scale down the font size
\addplot[no marks,domain=0.2:1.8] {-x+2}; % negative slope
\node[anchor=south] at (axis cs:0.2,1.8) {$\dot k = 0$}; % label of k0

\draw[dashed, gray] % k1 line
  (axis cs:0.25,0) node[below, black] {$k_1(\mu^{\ast})$} -- 
  (axis cs:0.25,1.5);
\draw[dashed, gray] % k2 line
  (axis cs:1.75,0) node[below, black] {$k_2(\mu^{\ast})$} -- 
  (axis cs:1.75,1.5);
\draw % c = 0 line
  (axis cs:1,0) node[below] {$k^{\ast}$} -- 
  (axis cs:1,2) node[above] {$\dot c=0$};
\draw[dashed,width=2em, gray] % c* line
  (axis cs:0,1) node[left, black] {$c^{\ast}$} -- 
  (axis cs:1,1);
\draw[myarr] % lower transition arrows
  (axis cs:0.4,0.4) -- 
  (axis cs:1,1);
\draw[myarr] % upper transition arrows
  (axis cs:1.6,1.6) -- 
  (axis cs:1,1);
\path % mini triangles
  pic at (axis cs:0.6,0.3) {coordsys} % down left
  pic[yscale=-1] at (axis cs:1.2,0.5) {coordsys} % down right
    pic[rotate=180] at (axis cs:1.4,1.8) {coordsys} % up right 
  pic[xscale=-1] at (axis cs:0.8,1.6) {coordsys}; % up left
\end{axis}
\normalsize
\end{tikzpicture}
\end{center}

我修改了你的代码以满足我的需求。我认为现在对我来说没问题了。我无法解决的最后一个问题是让 x 轴和 y 轴以某种方式从距原点 -0.1 处开始。这只是表面的,但很有趣。谢谢!

在此处输入图片描述

答案1

目前很难知道纯 TikZ 还是pgfplots是最好的工具,因为这两个包都允许轻松绘制问题中的图表。下面我展示了这两种可能性。

如果您需要绘制一些函数,那么pgfplots这是我的建议;如果不需要,那么纯 TikZ 就可以完成这项工作。

在这两种情况下,您都可以在绘制图表后使用适当的选项来缩放图表。使用pgfplots,您可以访问环境的width=<lenght>height=<lenght>选项axis,从而控制绘图的最终宽度和高度。另一方面,使用纯 TikZ,您可以设置x=<lenght>y=<lenght>(参见上面的代码),这也会缩放您的图表。在这两种情况下,您也有选项scale=<factor>(尽管这也会缩放可能不需要的标签)。

在下面的例子中我pgfplots仅用于说明;使用axis cs坐标系,您可以将元素放置在指定位置;一些装饰和图片,您就可以开始了:

在此处输入图片描述

代码:

\documentclass[border=3pt]{standalone}
\usepackage{pgfplots}
\usetikzlibrary{arrows,decorations.markings}

\tikzset{
  coordsys/.pic={
    \draw[->] (0,0) -- ++(6mm,0pt);
    \draw[->] (0,0) -- ++(0pt,6mm);
  },
  myarr/.style={decoration={
      markings,
      mark=between positions 0 and 1 step 4mm with {\arrow{stealth}},
    },
    postaction=decorate
  },
}

\begin{document}

\begin{tikzpicture}
\begin{axis}[
  axis lines=left,
  xmin=0,
  xmax=2.2,
  ymin=0,
  ymax=2.2,
  clip=false,
  xtick={\empty},
  ytick={\empty}
]
\addplot[no marks,domain=0.2:1.8] {-x+2};
\draw[dashed]
  (axis cs:0.25,0) node[below] {$k_1(\mu^{\ast})$} -- 
  (axis cs:0.25,1.5);
\draw[dashed]
  (axis cs:1.75,0) node[below] {$k_2(\mu^{\ast})$} -- 
  (axis cs:1.75,1.5);
\draw
  (axis cs:1,0) node[below] {$k^{\ast}$} -- 
  (axis cs:1,2) node[above] {$\iota=0$};
\draw[dashed]
  (axis cs:0,1) node[left] {$c^{\ast}$} -- 
  (axis cs:1,1);
\draw[myarr]
  (axis cs:0.4,0.4) -- 
  (axis cs:1,1);
\draw[myarr]
  (axis cs:1.6,1.6) -- 
  (axis cs:1,1);
\path
  pic at (axis cs:0.3,0.3) {coordsys}
  pic[rotate=180] at (axis cs:1.7,1.7) {coordsys}
  pic[xscale=-1] at (axis cs:0.8,1.7) {coordsys}
  pic[yscale=-1] at (axis cs:1.2,0.3) {coordsys};
  \end{axis}
\end{tikzpicture}%

\end{document}

想法相同,但是现在使用纯 TikZ:

\documentclass[border=3pt]{standalone}
\usepackage{pgfplots}
\usetikzlibrary{arrows,decorations.markings}

\tikzset{
  coordsys/.pic={
    \draw[->] (0,0) -- ++(6mm,0pt);
    \draw[->] (0,0) -- ++(0pt,6mm);
  },
  myarr/.style={decoration={
      markings,
      mark=between positions 0 and 1 step 4mm with {\arrow{stealth}},
    },
    postaction=decorate
  },
}

\begin{document}

\begin{tikzpicture}[x=3cm,y=3cm]
\draw[->]
  (-0.1,0) -- (2,0);
\draw[->]
  (0,-0.1) -- (0,2);
\draw[dashed]
  (0.25,0) node[below] {$k_1(\mu^{\ast})$} -- 
  (0.25,1.5);
\draw[dashed]
  (1.75,0) node[below] {$k_2(\mu^{\ast})$} -- 
  (1.75,1.5);
\draw
  (1,0) node[below] {$k^{\ast}$} -- 
  (1,2) node[above] {$\iota=0$};
\draw[dashed]
  (0,1) node[left] {$c^{\ast}$} -- 
  (1,1);
\draw[myarr]
  (0.4,0.4) -- 
  (1,1);
\draw[myarr]
  (1.6,1.6) -- 
  (1,1);
\path
  pic at (0.3,0.3) {coordsys}
  pic[rotate=180] at (1.7,1.7) {coordsys}
  pic[xscale=-1] at (0.8,1.7) {coordsys}
  pic[yscale=-1] at (1.2,0.3) {coordsys};
\end{tikzpicture}

\end{document}

在此处输入图片描述

如果您使用pgfplots,则可以使用width=<lenght>height=<lenght>选项来控制图的最终宽度和高度。另一方面,使用纯 TikZ,您可以设置x=<lenght>y=<lenght>(参见上面的代码),这也会缩放您的图表。在这两种情况下,您也都有选项scale=<factor>

相关内容