我想要绘制 8 个不等式和一条数轴,如下所示:
请注意,这与绘制不等式本身不同,就像绘制 x<2 的 x 数轴一样(也就是说,在图中显示不等式表达式本身是多余的)。就我而言,对于我的数轴变量的特定范围,多个不等式可能成立。也许最接近我的问题是:绘制非线性不等式的图形?(见最高分答案)。
所需规格:
- 水平布局:我需要我的图表采用水平布局并占据整个页面,以便更好地阅读(因为我需要在图表中拟合不等式本身);
- 底部的数轴:我需要 8 个不等式位于数轴上方,而不是一些在上面,一些在下面;
- 清晰度:我需要以最清晰的方式显示这 8 个不等式(我以最清晰的方式在图片中显示,或者像绘制非线性不等式的图形?会更好吗?如果后者更清楚,如何使脚本适应我的情况?也许你可以向我展示一个包含 3 或 4 个不等式的 MWE)。
MWE(抱歉格式不好):
\documentclass[tikz,border=5mm]{standalone}
\usepackage{tikz}
\usepackage{amssymb}
\usetikzlibrary{plotmarks}
\begin{document}
%---------------------------------------------------------
\begin{tikzpicture}
\coordinate (A) at (3,0);
\coordinate (B) at (7,0);
\coordinate (LE) at (0,0);
\draw[->, line width=0.1mm] (0,0) -- (10,0) ;
\path node[mark size=3pt,color=black] at (A) {\pgfuseplotmark{*}} node at (A) [below=5pt] {$\sigma_d$} node[mark size=3pt,color=black] at (B) {\pgfuseplotmark{*}} node at (B) [below=5pt] {$\sqrt{2}\sigma_d$};
\draw[->, line width=0.5mm] ([yshift=1cm]A) -- node[above] {$\partial f/\partial x$}([yshift=1cm]LE);
\draw[->, line width=0.5mm] ([yshift=2cm]B) -- node[above] {$\partial f/\partial y$}([yshift=2cm]LE);
\end{tikzpicture}
%---------------------------------------------------------
\end{document}
问题:
- 是将我的不等式放在箭头本身的顶部(就像在这个 MWE 中一样)还是放在数轴的右侧,像上面的链接中的解决方案一样堆叠在一起,这样更好?
- 是不是最好在单个箭头上有多个不等式(以减少箭头的数量,因为其中一些箭头适用于相同的范围)还是最好像我发布的图片中那样为每个不等式设置一个箭头?
- 如何在数轴的右端添加变量名“sigma_v”?
多谢!
答案1
我必须承认,作为一名初学者,你已经取得了相当好的开端Tikz
。
绘制此类图画的方法不止一种。这里我向您展示了一些替代方法,还指导您使用一些不错的 Tikz 功能,让您快速上手。
自定义格式
应该不言而喻。你只需在开发过程中引入、使用和修改它们,通常为时已晚。例如,你可能会发现你使用了相同的选项,因此你会重构它们,即让它们成为一种风格并使用它。
轴
可以直接完成。有些人喜欢相对放置,或者 tikzlibrary positioning
。但是,此图足够简单明了,可以使用绝对(手动缩放)坐标。
第一条路径:
- 回想一下,从语法上讲,Tikz 以 开始一条路径,
\
并以 结束一条路径;
- 其间的一切都是动作(就像电影场景一样)
- 所以画
- 两个点,其中第二点是相对而言的
- 在你完成之前放一个节点
- 将其锚定在西边(即在伪代码中 tip.east 与 node.west 匹配)
第二条路径类似,除了重复绘制几次以勾选轴。您也可以使用其他长度单位,例如毫米。
% ~~~ horizontal axis with tiks ~~~~~
% changed from width 6 to 12 to "uncrowd" the labels
\draw[->] (0,0) -- +(12,0) node[anchor=west]{$\sigma_v$};
% to replicate your sketch
\foreach \t in {1,2,3,4, 4.5, 5}
\draw (2*\t,0) -- +(0,2pt) -- +(0,-2pt);
轴标签
您只需放置节点即可。如果您为它们赋予不同的名称,例如 X4,那么未来的生活将变得更加轻松。
% ~~~ axis labels: though this step could be looped,
% I think it results in more readable code this way
\node[lbl] at (2,0) {$\sigma_d$};
\node[lbl] (X4) at (8,0) {$\frac{\sqrt{10}}{2}\sigma_d$};
你的不平等之箭
我向你展示两种方法。
第一个情况是这样的:
- 画一条线,就像轴一样
- 要让它蜿蜒曲折,你可以说:(向上 |)(侧面 -)或
|-
- 在路径结束之前,放置一个用于不等式文本的节点
- 你用
pos
- 从本质上来说,这是一次反复试验
- 将其固定在南边,这样它就会位于水平部分之上
\draw[->] (6,0) |- (0,5)
% ~~~ trial and error wrt pos ~~~~~~~~~
node[pos=.5,anchor=south]{$\partial f/\partial x$};
第二个使用中间坐标,在本例中为 (A2)。我经常发现分割路径来定位节点更容易:
- 路径从 A2 开始
- 放置节点的位置
- 并将其锚定在东边(即 A2)
\draw[] (8,0) |- +(0,3) coordinate(A2);
\draw[->] (A2) node[anchor=south east,ineq] {
$\partial f/\partial x$}
-- (0,3) ;
向下箭头
仅用于演示目的:这样 Tikz 就会自动放置起点。
% ~~~ the advantage of giving the label nodes a name ~~~
\draw[->] (X4) -- +(0,-1);
易读性
把不等式放在哪儿取决于你。通常,一旦你创建了一个小小的图形混乱,它就会更容易地揭示出你应该把它们放在哪里以及如何放置它们:可能会有差异。例如,一些标签可以沿着线放置,而其他标签可以放在靠近结束箭头尖端(锚点=东)的更好(即更有意义)的位置。
我展示了一个通过样式添加一些背景填充的示例ineq
。
结果+代码
\documentclass[10pt,tikz,border=5mm]{standalone} % <<<
%\usepackage{tikz} % already loaded with class statement
\usepackage{amssymb}
\usetikzlibrary{arrows.meta} % <<<
\begin{document}
%---------------------------------------------------------
\begin{tikzpicture}[ % self-defined styles
>={Stealth}, % change all arrow tips
lbl/.style={anchor=north},
ineq/.style={fill=teal!10},
]
% ~~~ horizontal axis with tiks ~~~~~
% changed from width 6 to 12 to "uncrowd" the labels
\draw[->] (0,0) -- +(12,0) node[anchor=west]{$\sigma_v$};
% to replicate your sketch
\foreach \t in {1,2,3,4, 4.5, 5}
\draw (2*\t,0) -- +(0,2pt) -- +(0,-2pt);
% ~~~ axis labels: though this step could be looped,
% I think it results in more readable code this way
\node[lbl] at (2,0) {$\sigma_d$};
\node[lbl] (X4) at (8,0) {$\frac{\sqrt{10}}{2}\sigma_d$};
% ~~~ your arrows with inequalitites ~~~~~~
\draw[->] (6,0) |- (0,5)
% ~~~ trial and error wrt pos ~~~~~~~~~
node[pos=.5,anchor=south]{$\partial f/\partial x$};
% alternative using an intermediat coordinate, split
\draw[] (8,0) |- +(0,3) coordinate(A2);
\draw[->] (A2) node[anchor=south east,ineq] {
$\partial f/\partial x$}
-- (0,3) ;
% ~~~ the advantage of giving the label nodes a name ~~~
\draw[->] (X4) -- +(0,-1);
\end{tikzpicture}
\end{document}