免費論壇 繁體 | 簡體
Sclub交友聊天~加入聊天室當版主
分享
返回列表 发帖

直方图、流程图

话说前些天用latex给v6排版某资料,由于包含了高中数学各种内容,不得不撸一些从没撸的无聊东西,其中两样就是直方图和流程图,下面来记录一下,以免日后遗忘(因为平时不排这些,易忘)。

一、直方图

中学阶段的直方图都差不多,格式较为固定,所以还是较好处理的。

%需要的宏包和库
\usepackage{amsmath}
\usepackage{tikz}
\usetikzlibrary{calc}
\tikzset{every picture/.style={>=latex}}

%坐标轴设定
\newcommand\plzj{\$\dfrac{\text{频率}}{\text{组距}}\$}
\newcommand\zftw{--++(0.2,0)
--++(0.05,0.15)--++(0.1,-0.3)--++(0.05,0.15)
--++(0.05,0.15)--++(0.1,-0.3)--++(0.05,0.15)
--++(0.05,0.15)--++(0.1,-0.3)--++(0.05,0.15)
--++(0.2,0)}
\newcommand\zftzb[6]{%
\draw[<->] (0,#3/\zftyb)node[right]{\plzj}
--(0,0)node[below]{0} \zftw --(#1,0)node[above]{#2};
\foreach \i in {1,2,...,#6} {
\node[below] at (\i,0) {\pgfmathparse{int(#4+#5*(\i-1))}\pgfmathresult};
}}
%用法:
%\zftzb{x轴长}{x轴标}{y轴长}{x轴刻度开始}{组距}{刻度个数}
%此处y轴长非实际长度,而是比最高的直方数值大一些即可

%画直方命令
\newcount\zftctr
\newcommand\zftyb{1}%y轴的比例
\makeatletter
\newcommand\zft{\@ifstar{\zftb}{\zfta}}
\makeatother
\newcommand\zfta[2][]{\advance\zftctr by 1\relax
\draw (\zftctr,#2/\zftyb) rectangle (\zftctr+1,0);
\draw[dashed] (0,#2/\zftyb)node[left,#1]{#2}--(\zftctr,#2/\zftyb);
}
\newcommand\zftb[1]{\advance\zftctr by 1\relax
\draw (\zftctr,#1/\zftyb) rectangle (\zftctr+1,0);
}
%用法:
%用\zft{...}画直方,无需标y值的用\zft*{...},
%调节数字位置用\zft[shift={(...)}]{...}

\newcommand\zftkz{%靠左式,即组从0开始时用
\zftctr=-1\relax\def\zftw{}}


%实例
  1. \begin{document}

  2. \begin{tikzpicture}
  3. \def\zftyb{0.008}%设定y轴比例,一定要先设
  4. \zftzb{8}{分数}{0.036}{40}{10}{7}
  5. %\zftzb{x长}{x标}{y长}{刻度始}{组距}{刻度数}
  6. \zft{0.005}
  7. \zft*{0.015}
  8. \zft{0.030}
  9. \zft{0.025}
  10. \zft{0.015}
  11. \zft{0.010}
  12. \end{tikzpicture}

  13. \begin{tikzpicture}
  14. \def\zftyb{0.01}
  15. \zftkz
  16. \zftzb{6}{指标}{0.045}{10}{10}{5}
  17. \zft[shift={(0,-2pt)}]{0.006}
  18. \zft{0.026}
  19. \zft{0.038}
  20. \zft{0.022}
  21. \zft[shift={(0,2pt)}]{0.008}
  22. \end{tikzpicture}

  23. \end{document}
复制代码
效果:
zft.png
2016-11-22 15:56


测试文档: Zhift.tex (1.89 KB)
分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
冇钱又冇样、冇型又冇款、冇身材又冇文采、冇学历又冇能力、冇高度冇速度冇力度兼夹冇野做!(粤语)
口号:珍爱生命,远离考试。

二、流程图

\usepackage{amsmath}
\usepackage{tikz}
\usetikzlibrary{
shapes.geometric,   %几何形状
calc,               %计算
positioning         %用于定位
}
\tikzset{
every picture/.style={
>=latex,
node distance=5mm and 5mm
%有无and的区别见手册positioning部分
}}

%定义框形状
\tikzstyle{SS}      %开始结束
=[rounded corners, draw]
\tikzstyle{IO}      %输入输出
=[trapezium, trapezium left angle=70, trapezium right angle=110, draw]
\tikzstyle{NR}      %内容
=[draw]
\tikzstyle{PD}      %判断
=[diamond, aspect=4, draw, inner sep=1.5pt]


%例1
  1. \begin{tikzpicture}[->]
  2. %放框
  3. \node[SS](start){开始};
  4. \node[IO, below=of start](in){输入$N$};
  5. \node[NR, below=of in](n1){$k=1$, $S=0$};
  6. \node[NR, below=of n1](n2){$S=S+\dfrac1{k(k+1)}$};
  7. \node[NR, right=of n2](n3){$k=k+1$};
  8. \node[PD, below=of n2](pd){$k<N$};
  9. \node[IO, below=of pd](out){输出$S$};
  10. \node[SS, below=of out](stop){结束};
  11. %连线
  12. \path
  13. (start) edge (in)
  14. (in) edge (n1)
  15. (n1) edge (n2)
  16. (n2) edge (pd)
  17. (pd) edge node[right]{否}(out)
  18. (out) edge (stop);
  19. \draw (pd.east)node[below]{是} -| (n3);
  20. \draw (n3) |- ($(n1.south)!0.5!(n2.north)$);
  21. \end{tikzpicture}
复制代码
效果:
lct1.png
2016-11-22 16:14


%例2
  1. \begin{tikzpicture}[->]
  2. \node[SS](start){开始};
  3. \node[NR, below=of start](n1){$a=1$};
  4. \node[NR, below right=1mm and 5mm of n1](n2){$a=a^2+2$};
  5. \node[PD, below=8mm of n1](pd){$a<10$?};
  6. \node[IO, below=of pd](out){输出$a$};
  7. \node[SS, below=of out](stop){结束};
  8. \path (start) edge (n1)
  9. (n1) edge (pd)
  10. (pd) edge node[right]{否}(out)
  11. (out) edge (stop);
  12. \draw (pd.east)node[below]{是} -| (n2);
  13. \draw (n2) -- (n2-|n1);
  14. \end{tikzpicture}
复制代码
效果:
lct2.png
2016-11-22 16:14


%例3
  1. \begin{tikzpicture}[->]
  2. \node[SS](start){开始};
  3. \node[IO, below=of start](in){输入$x$, $t$};
  4. \node[NR, below=of in](n1){$M=1$, $S=3$, $k=1$};
  5. \node[PD, below=of n1](pd){$k\le t$};
  6. \node[NR, on grid, below left=1cm and 2cm of pd](n3){$M=\dfrac Mkx$};
  7. \node[IO, on grid, below right=1cm and 2cm of pd](out){输出$S$};
  8. \node[NR, below=of n3](n4){$S=M+S$};
  9. \node[NR, below=of n4](n5){$k=k+1$};
  10. \node[SS, below=of out](stop){结束};
  11. \path (start) edge (in)
  12. (in) edge (n1)
  13. (n1) edge (pd)
  14. (n3) edge (n4)
  15. (n4) edge (n5)
  16. (out) edge (stop);
  17. \draw (pd) -| node[left]{是} (n3);
  18. \draw (pd) -| node[right]{否} (out);
  19. \draw (n5.west)--++(-0.5,0) |- ($(n1.south)!0.5!(pd.north)$);
  20. \end{tikzpicture}
复制代码
效果:
lct3.png
2016-11-22 16:14



更多实例见测试文档: LiuCT.tex (5.25 KB)
冇钱又冇样、冇型又冇款、冇身材又冇文采、冇学历又冇能力、冇高度冇速度冇力度兼夹冇野做!(粤语)
口号:珍爱生命,远离考试。

TOP

嘿嘿,果然是需要用时才搞。

这个很有参考价值,特别对试卷排版有要求的。

TOP

回复 3# isee

没事谁会去搞这些无聊的东西

TOP

唉,有一阵还想学学怎么编程序,结果最终没学下去。看网友编程解决一些问题总觉得很强大的样子,从智力趣题到网页分析,还有好多东西都用程序来做。

TOP

本帖最后由 青青子衿 于 2019-3-14 13:11 编辑

回复 4# kuing
没事谁会去搞这些无聊的东西
kuing 发表于 2016-11-22 17:09

我呀
程序框图真好玩!
  1. \begin{document}

  2. \begin{tikzpicture}
  3. \begin{scope}[->]
  4. \node[SS](start){开始};
  5. \node[IO, below=of start](in)           %输入正整数
  6. {输入$M$};
  7. \node[PD, below=of in](pd1)           %判断正整数
  8. {$M$是否为正整数};
  9. \node[NR, below=of pd1,align=center](n1)            %求出标准分解
  10. {求出$M$的\\标准素数分解};
  11. \node[PD, below=of n1,align=center,font=\zihao{5},scale=0.7](pd2)       %判断是否含模4余3的素因子
  12. {是否含$3\pmod{4}$型素因子};
  13. \node[IO, on grid, below right=4.5cm and 3cm of pd2,align=center,font=\zihao{6}](out1)  %输出能分解为两个整数的平方和
  14. {输出$M$能\\分解为两个\\整数的平方和};
  15. \node[NR, on grid, below left=1cm and 3cm of pd2,align=center,font=\zihao{6}](n2)  %只求出模4余3型素因子的次数
  16. {只求出\\$3\pmod{4}$型\\素因子的次数};
  17. \node[PD, below=of n2,align=center,font=\zihao{5},scale=0.7](pd3)    %判断每一个素因子的次数是否都是偶数
  18. {每一个所求次数是否都是偶数};
  19. \node[IO, below=of pd3,align=center,font=\zihao{6}](out2)              %输出M不能分解为两个整数的平方和
  20. {输出$M$不能\\分解为两个\\整数的平方和};
  21. \node[below=5cm of pd2](bstop){};                                    %结束之前
  22. \node[SS, below=6cm of pd2](stop){结束};                             %结束

  23. \path
  24. (start) edge (in)
  25. (in) edge (pd1)
  26. (pd1) edge (n1)
  27. (n1) edge (pd2)
  28. (n2) edge (pd3);

  29. \draw (pd1.east)--++(0.5,0)node[right]{否} |- ($(start.south)!0.5!(in.north)$);
  30. \draw (pd1) edge node[left]{是} (n1);
  31. \draw (pd2) -| node[left]{是} (n2);
  32. \draw (pd2) -| node[right]{否} (out1);
  33. \draw (pd3) edge node[right]{否} (out2);
  34. \end{scope}
  35. \draw (out2)|- (bstop.center);
  36. \draw (out1)|- (bstop.center);
  37. \draw[->](bstop.center)--(stop.north);
  38. \draw[->](pd3.east)--node[above]{是}(pd3.east-|out1.north);
  39. \end{tikzpicture}


  40. \end{document}
复制代码
3329.png
2019-3-13 22:35

TOP

学习了,有一个问题,比如有些直方图要求某个纵坐标,那个位置标a,b,这个怎么实现呢?

TOP

第二个问题,流程图某个框要留白,设置问题,可是一旦没有文字,就会显示一个很小的框,能不能输入一些文字,把框撑大,但不显示呢,或者直接把框变得大一些

TOP

回复 8# odds

直接把框变得大一些,可以设定框的 minimum height 和 minimum width 使之高度和宽度不少于设定的值。
比如上面 例1 的
\node[NR, below=of n1](n2){\$S=S+\dfrac1{k(k+1)}\$};
这行改成
\node[NR, below=of n1, minimum height=1cm, minimum width=3cm](n2){};
酱紫。
但测试时发现,对于输入输出的平行四边形框,用它好像有点问题。

另一种方法就是用 \phantom ,比如
\node[NR, below=of n1](n2){\phantom{\$S=S+\dfrac1{k(k+1)}\$}};
就是你想要的输入东西把框撑大但不显示,这种方法对所有情况都没问题,而且还能确保和有公式时是一样大的。

TOP

学习了,有一个问题,比如有些直方图要求某个纵坐标,那个位置标a,b,这个怎么实现呢? ...
odds 发表于 2019-12-11 13:49

意思是要将左边那些 0.0几 的某些换成字母是吗?如果是的话,那再建一个命令来画好了,比如
\newcommand\zftx[3][]{\advance\zftctr by 1\relax
\draw (\zftctr,#2/\zftyb) rectangle (\zftctr+1,0);
\draw[dashed] (0,#2/\zftyb)node[left,#1]{#3}--(\zftctr,#2/\zftyb);
}
酱紫。
使用的时候比如
  1. \begin{tikzpicture}
  2. \def\zftyb{0.008}%设定y轴比例,一定要先设
  3. \zftzb{8}{分数}{0.036}{40}{10}{7}
  4. %\zftzb{x长}{x标}{y长}{刻度始}{组距}{刻度数}
  5. \zft{0.005}
  6. \zft*{0.015}
  7. \zft{0.030}
  8. \zftx{0.025}{$a$}
  9. \zftx{0.015}{$b$}
  10. \zft{0.010}
  11. \end{tikzpicture}
复制代码

TOP

实现了!感谢楼上!虽然还不会直接@楼上,而且代码并没有看懂,哈哈哈如果想看懂代码,可以怎么学习一下呢,谢谢!!!

TOP

回复 11# odds

在相应楼层点“回复”来回帖就相当于 @ 他了啊
不过,色k就是我,我就是色k
想看懂代码的话,得对 latex 有一定基础,还要了解 tikz,这需要有足够的闲情……

TOP

回复 12# kuing


    了解层内回复这项技术了,我在通过看代码推测tikz语句功能,有木有可以学习这些语句的资料哩

TOP

回复 13# odds

系统自带手册,命令行运行 texdoc tikz 即可,千多页,英文的。
网上也有人整理了学习笔记,中文版的,见:https://www.latexstudio.net/archives/11825.html

TOP

回复 14# kuing


    非常感谢

TOP

频分布直方图的横轴不支持显示小数的,请指导。。。

TOP

频分布直方图的横轴不支持显示小数的,请指导。。。
bolangnet 发表于 2020-2-26 21:57
噢,这是我的问题,没考虑到横轴会有小数的情况,那我的代码就得改进了……

首先说下为什么会造成不支持小数,是因为 tikz 的 \pgfmathparse 即使计算结果是整数也会带一个 .0 在后面,只有用 int() 之类的整数型函数才会没有,结果就是再也不会显示小数了。

要解决它,就是不用 int() 而另想办法,暂时想到用 siunitx 宏包,它可以处理数字的输出。

在导言区添加:
\usepackage{siunitx}
\sisetup{round-mode = places, round-precision = 0}%默认舍小数
然后画坐标轴的命令 \zftzb 改成:
\newcommand\zftzb[6]{%
\draw[<->] (0,#3/\zftyb)node[right]{\plzj}
--(0,0)node[below]{0} \zftw --(#1,0)node[above]{#2};
\foreach \i in {1,2,...,#6} {
\node[below] at (\i,0) {\pgfmathparse{#4+(\i-1)*#5}\num{\pgfmathresult}};
}}
这样,默认情况下是整数,当需要小数时,先用 \sisetup{round-precision = 保留的小数位数} 设置后再画即可(最好在 tikzpicture 环境内设置,只影响局部),比如:
  1. \begin{tikzpicture}
  2. \def\zftyb{0.008}%设定y轴比例
  3. \sisetup{round-precision = 1}%保留一位小数
  4. \zftzb{8}{分数}{0.036}{4}{0.2}{7}
  5. %\zftzb{x长}{x标}{y长}{刻度始}{组距}{刻度数}
  6. \zft{0.005}
  7. \zft*{0.015}
  8. \zft{0.030}
  9. \zft{0.025}
  10. \zft{0.015}
  11. \zft{0.010}
  12. \end{tikzpicture}
复制代码
得:
QQ截图20200227043527.png
2020-2-27 04:38


如果哪位有更好的办法,麻烦回帖告知
冇钱又冇样、冇型又冇款、冇身材又冇文采、冇学历又冇能力、冇高度冇速度冇力度兼夹冇野做!(粤语)
口号:珍爱生命,远离考试。

TOP

大佬,请问怎么修改坐标轴上点的距离啊?
在排版试卷结果发现大小不太符合
QQ20211025-143714@2x.jpg
2021-10-25 15:17

TOP

回复 18# hyperhe

在 \begin{tikzpicture} 后加 [xscale=0.8] 之类缩小一下可以吗?

TOP

返回列表 回复 发帖