如何在数轴上创建许多不等式的综合图表?

如何在数轴上创建许多不等式的综合图表?

我想要绘制 8 个不等式和一条数轴,如下所示:

在此处输入图片描述

请注意,这与绘制不等式本身不同,就像绘制 x<2 的 x 数轴一样(也就是说,在图中显示不等式表达式本身是多余的)。就我而言,对于我的数轴变量的特定范围,多个不等式可能成立。也许最接近我的问题是:绘制非线性不等式的图形?(见最高分答案)。

所需规格:

  1. 水平布局:我需要我的图表采用水平布局并占据整个页面,以便更好地阅读(因为我需要在图表中拟合不等式本身);
  2. 底部的数轴:我需要 8 个不等式位于数轴上方,而不是一些在上面,一些在下面;
  3. 清晰度:我需要以最清晰的方式显示这 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}

上述代码生成: 在此处输入图片描述

问题:

  1. 是将我的不等式放在箭头本身的顶部(就像在这个 MWE 中一样)还是放在数轴的右侧,像上面的链接中的解决方案一样堆叠在一起,这样更好?
  2. 是不是最好在单个箭头上有多个不等式(以减少箭头的数量,因为其中一些箭头适用于相同的范围)还是最好像我发布的图片中那样为每个不等式设置一个箭头?
  3. 如何在数轴的右端添加变量名“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}

相关内容