在 TikZ 中采用分数图

在 TikZ 中采用分数图

有了这个 MWE

\documentclass[letterpaper]{article}
\usepackage{amsmath, tikz}
\usetikzlibrary{calc}

\newcounter{CountOfSections}
\newcommand{\fracgraph}[3][1]{%
    % #1 = optional height
    \begin{tikzpicture}
        \setcounter{CountOfSections}{0}%
        \foreach \Size/\Options in {#3} {%
            \stepcounter{CountOfSections}%
            \pgfmathsetmacro{\YCoord}{#1*\arabic{CountOfSections}}%
            \draw  (0,-\YCoord) rectangle (#2,-\YCoord+#1);
            \pgfmathsetmacro{\Xincrement}{#2/\Size}%
            \foreach \x in {1,...,\Size} {%
                \pgfmathsetmacro{\Xcoord}{\x*\Xincrement}%
                \pgfmathsetmacro{\XcoordLabel}{(\x-0.5)*\Xincrement}%
                \draw [fill=\Options]  ($(\Xcoord-\Xincrement,-\YCoord)$)  rectangle ($(\Xcoord,-\YCoord+#1)$);
                \node at ($(\XcoordLabel,-\YCoord+0.5*#1)$) {$\frac{1}{\Size}$};
            }%
        }%
    \end{tikzpicture}
}

%-----------------------------------------------------------
% begin document
\begin{document}

\fracgraph{12}{7/pink,10/gray!50}

\end{document}

我可以创建类似这样的东西:在此处输入图片描述

我在网上找到了这个代码,它非常方便。但我希望稍微采用一下,这样我就可以画出 - 例如 - 6/7 和 8/10。我希望其他矩形是白色的。我该怎么做?

好吧,我实际上更接近解决方案,采用了几行代码。我将其改为 \foreach \Size/\Options in {#3}\foreach \Number/\Size/\Options in {#3} 添加了 \draw [fill=\Options] (0,-\YCoord) rectangle (#2*\Number/\Size,-\YCoord+#1);

我的新 MWE 是

\usepackage{amsmath, tikz}
\usetikzlibrary{calc}

\newcounter{CountOfSections}
\newcommand{\fracgraph}[3][1]{%
    % #1 = optional height
    \begin{tikzpicture}
        \setcounter{CountOfSections}{0}%
        \foreach \Number/\Size/\Options in {#3} {%
            \stepcounter{CountOfSections}%
            \pgfmathsetmacro{\YCoord}{#1*\arabic{CountOfSections}}%
            \draw  (0,-\YCoord) rectangle (#2,-\YCoord+#1);
            \pgfmathsetmacro{\Xincrement}{#2/\Size}%
            \foreach \x in {1,...,\Size} {%
                \pgfmathsetmacro{\Xcoord}{\x*\Xincrement}%
                \pgfmathsetmacro{\XcoordLabel}{(\x-0.5)*\Xincrement}%
                \draw [fill=\Options] (0,-\YCoord) rectangle (#2*\Number/\Size,-\YCoord+#1);
                \draw [fill=white]  ($(\Xcoord-\Xincrement,-\YCoord)$)  rectangle ($(\Xcoord,-\YCoord+#1)$);
                \node at ($(\XcoordLabel,-\YCoord+0.5*#1)$) {$\frac{1}{\Size}$};
                
            }%
        }%
    \end{tikzpicture}
}

%-----------------------------------------------------------
% begin document
\begin{document}

\fracgraph{12}{6/7/pink,8/10/gray!50}

\end{document} 

并产生:

在此处输入图片描述

我想查看整张图片上的分数。我该怎么做?

答案1

以下代码变体可以实现您想要的功能。我稍微简化了代码。该命令\fracgraph现在将由斜线分隔的三个部分组成的值列表作为第二个参数(而不是像以前那样只有两个)。第二部分标记应填充的最后一段。

为了在传递给的不同值之间切换fill,我使用了 PGF 的ifthenelse函数。

\documentclass[letterpaper]{article}
\usepackage{amsmath, tikz}
\usetikzlibrary{calc}

\newcounter{CountOfSections}
\newcommand{\fracgraph}[3][1]{%
    % #1 = optional height
    \begin{tikzpicture}
        \foreach \Size/\Stop/\Options [count=\c] in {#3} {
            \pgfmathsetmacro{\YCoord}{#1*\c}
            \pgfmathsetmacro{\Xincrement}{#2/\Size}
            \foreach \x in {1,...,\Size} {
                \pgfmathsetmacro{\Xcoord}{\x*\Xincrement}
                \pgfmathsetmacro{\XcoordLabel}{(\x-0.5)*\Xincrement}
                \pgfmathsetmacro{\XCoordFill}{ifthenelse(\x > \Stop, "none", "\Options")}
                \draw[fill=\XCoordFill] 
                    ($(\Xcoord-\Xincrement,-\YCoord)$) rectangle ($(\Xcoord,-\YCoord+#1)$);
                \node at ($(\XcoordLabel,-\YCoord+0.5*#1)$) {$\frac{1}{\Size}$};
            }%
        }%
    \end{tikzpicture}
}

%-----------------------------------------------------------
% begin document
\begin{document}

\fracgraph{12}{7/3/pink,10/9/gray!50}

\end{document}

在此处输入图片描述

答案2

在 TeX 原语的帮助下,\ifnum我们可以将其变成一行。

图表的大小由值xy位置控制——忽略线宽——

  • x = 12cm指定图表的宽度为 12cm,
  • y = 1cm指定一行的高度。

CountOfSections我们可以使用内置的 PGFFor 选项,而不用 LaTeX 计数器count = \Row

节点位于每个矩形角的中间。

如果,则需要做更多的工作\Style,即列表条目的第三个变量不仅仅是颜色,还应该改变其他设置。

代码

\documentclass[tikz]{standalone}
\usepackage{amsmath}
\newcommand*\fracgraph[2][]{%
  \tikz[x=12cm,y=1cm,#1]
    \foreach[count=\Row] \Number/\Size/\Style in {#2}
      \foreach \NUMBER in {0, ..., \pgfinteval{\Size-1}}%
 % or \foreach[count=\NUMBER from 0]\throwaway in {1, ..., \Size}
        \draw[fill=\ifnum\NUMBER<\Number\Style\else none\fi] (\NUMBER/\Size, -\Row)
          rectangle node {$\tfrac{1}{\Size}$} +(1/\Size,-1);%
}
\begin{document}
\fracgraph{6/7/pink, 8/10/gray!50}
\end{document}

输出

在此处输入图片描述

相关内容