悠闲数学娱乐论坛(第2版)'s Archiver

kuing 发表于 2016-11-22 15:56

直方图、流程图

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

一、直方图

中学阶段的直方图都差不多,格式较为固定,所以还是较好处理的。[code]%需要的宏包和库
\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{}}[/code]%实例[code]\begin{document}

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

\begin{tikzpicture}
\def\zftyb{0.01}
\zftkz
\zftzb{6}{指标}{0.045}{10}{10}{5}
\zft[shift={(0,-2pt)}]{0.006}
\zft{0.026}
\zft{0.038}
\zft{0.022}
\zft[shift={(0,2pt)}]{0.008}
\end{tikzpicture}

\end{document}[/code]效果:
[attach]4585[/attach]

测试文档:[attach]4586[/attach]

kuing 发表于 2016-11-22 16:02

二、流程图[code]\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][/code]%例1[code]\begin{tikzpicture}[->]
%放框
\node[SS](start){开始};
\node[IO, below=of start](in){输入$N$};
\node[NR, below=of in](n1){$k=1$, $S=0$};
\node[NR, below=of n1](n2){$S=S+\dfrac1{k(k+1)}$};
\node[NR, right=of n2](n3){$k=k+1$};
\node[PD, below=of n2](pd){$k<N$};
\node[IO, below=of pd](out){输出$S$};
\node[SS, below=of out](stop){结束};
%连线
\path
(start) edge (in)
(in) edge (n1)
(n1) edge (n2)
(n2) edge (pd)
(pd) edge node[right]{否}(out)
(out) edge (stop);
\draw (pd.east)node[below]{是} -| (n3);
\draw (n3) |- ($(n1.south)!0.5!(n2.north)$);
\end{tikzpicture}[/code]效果:
[attach]4587[/attach]

%例2[code]\begin{tikzpicture}[->]
\node[SS](start){开始};
\node[NR, below=of start](n1){$a=1$};
\node[NR, below right=1mm and 5mm of n1](n2){$a=a^2+2$};
\node[PD, below=8mm of n1](pd){$a<10$?};
\node[IO, below=of pd](out){输出$a$};
\node[SS, below=of out](stop){结束};
\path (start) edge (n1)
(n1) edge (pd)
(pd) edge node[right]{否}(out)
(out) edge (stop);
\draw (pd.east)node[below]{是} -| (n2);
\draw (n2) -- (n2-|n1);
\end{tikzpicture}[/code]效果:
[attach]4588[/attach]

%例3[code]\begin{tikzpicture}[->]
\node[SS](start){开始};
\node[IO, below=of start](in){输入$x$, $t$};
\node[NR, below=of in](n1){$M=1$, $S=3$, $k=1$};
\node[PD, below=of n1](pd){$k\le t$};
\node[NR, on grid, below left=1cm and 2cm of pd](n3){$M=\dfrac Mkx$};
\node[IO, on grid, below right=1cm and 2cm of pd](out){输出$S$};
\node[NR, below=of n3](n4){$S=M+S$};
\node[NR, below=of n4](n5){$k=k+1$};
\node[SS, below=of out](stop){结束};
\path (start) edge (in)
(in) edge (n1)
(n1) edge (pd)
(n3) edge (n4)
(n4) edge (n5)
(out) edge (stop);
\draw (pd) -| node[left]{是} (n3);
\draw (pd) -| node[right]{否} (out);
\draw (n5.west)--++(-0.5,0) |- ($(n1.south)!0.5!(pd.north)$);
\end{tikzpicture}[/code]效果:
[attach]4589[/attach]


更多实例见测试文档:[attach]4590[/attach]

isee 发表于 2016-11-22 16:30

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

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

kuing 发表于 2016-11-22 17:09

[b]回复 [url=http://kuing.orzweb.net/redirect.php?goto=findpost&pid=19420&ptid=4319]3#[/url] [i]isee[/i] [/b]

{:lol:}没事谁会去搞这些无聊的东西

abababa 发表于 2016-11-22 19:10

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

青青子衿 发表于 2019-3-13 22:25

[i=s] 本帖最后由 青青子衿 于 2019-3-14 13:11 编辑 [/i]

[b]回复 [url=http://kuing.orzweb.net/redirect.php?goto=findpost&pid=19421&ptid=4319]4#[/url] [i]kuing[/i] [/b]
[quote]
没事谁会去搞这些无聊的东西
[size=2][color=#999999]kuing 发表于 2016-11-22 17:09[/color] [url=http://kuing.orzweb.net/redirect.php?goto=findpost&pid=19421&ptid=4319][img]http://kuing.orzweb.net/images/common/back.gif[/img][/url][/size][/quote]
我呀{:lol:}
程序框图真好玩![code]\begin{document}

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

\path
(start) edge (in)
(in) edge (pd1)
(pd1) edge (n1)
(n1) edge (pd2)
(n2) edge (pd3);

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


\end{document}[/code][attach]7051[/attach]

odds 发表于 2019-12-11 13:49

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

odds 发表于 2019-12-11 14:34

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

色k 发表于 2019-12-11 15:50

[b]回复 [url=http://kuing.orzweb.net/redirect.php?goto=findpost&pid=34383&ptid=4319]8#[/url] [i]odds[/i] [/b]

直接把框变得大一些,可以设定框的 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)}\$}};
就是你想要的输入东西把框撑大但不显示,这种方法对所有情况都没问题,而且还能确保和有公式时是一样大的。

色k 发表于 2019-12-11 16:34

[quote]学习了,有一个问题,比如有些直方图要求某个纵坐标,那个位置标a,b,这个怎么实现呢? ...
[size=2][color=#999999]odds 发表于 2019-12-11 13:49[/color] [url=http://kuing.orzweb.net/redirect.php?goto=findpost&pid=34382&ptid=4319][img]http://kuing.orzweb.net/images/common/back.gif[/img][/url][/size][/quote]
意思是要将左边那些 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);
}
酱紫。
使用的时候比如[code]\begin{tikzpicture}
\def\zftyb{0.008}%设定y轴比例,一定要先设
\zftzb{8}{分数}{0.036}{40}{10}{7}
%\zftzb{x长}{x标}{y长}{刻度始}{组距}{刻度数}
\zft{0.005}
\zft*{0.015}
\zft{0.030}
\zftx{0.025}{$a$}
\zftx{0.015}{$b$}
\zft{0.010}
\end{tikzpicture}[/code]

odds 发表于 2019-12-11 18:09

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

kuing 发表于 2019-12-11 23:32

[b]回复 [url=http://kuing.orzweb.net/redirect.php?goto=findpost&pid=34389&ptid=4319]11#[/url] [i]odds[/i] [/b]

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

odds 发表于 2019-12-12 00:06

[b]回复 [url=http://kuing.orzweb.net/redirect.php?goto=findpost&pid=34393&ptid=4319]12#[/url] [i]kuing[/i] [/b]


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

kuing 发表于 2019-12-12 00:13

[b]回复 [url=http://kuing.orzweb.net/redirect.php?goto=findpost&pid=34396&ptid=4319]13#[/url] [i]odds[/i] [/b]

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

odds 发表于 2019-12-17 23:22

[b]回复 [url=http://kuing.orzweb.net/redirect.php?goto=findpost&pid=34397&ptid=4319]14#[/url] [i]kuing[/i] [/b]


    非常感谢

bolangnet 发表于 2020-2-26 21:57

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

kuing 发表于 2020-2-27 04:38

[quote]频分布直方图的横轴不支持显示小数的,请指导。。。
[size=2][color=#999999]bolangnet 发表于 2020-2-26 21:57[/color] [url=http://kuing.orzweb.net/redirect.php?goto=findpost&pid=35104&ptid=4319][img]http://kuing.orzweb.net/images/common/back.gif[/img][/url][/size][/quote]噢,这是我的问题,没考虑到横轴会有小数的情况,那我的代码就得改进了……

首先说下为什么会造成不支持小数,是因为 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 环境内设置,只影响局部),比如:[code]\begin{tikzpicture}
\def\zftyb{0.008}%设定y轴比例
\sisetup{round-precision = 1}%保留一位小数
\zftzb{8}{分数}{0.036}{4}{0.2}{7}
%\zftzb{x长}{x标}{y长}{刻度始}{组距}{刻度数}
\zft{0.005}
\zft*{0.015}
\zft{0.030}
\zft{0.025}
\zft{0.015}
\zft{0.010}
\end{tikzpicture}[/code]得:
[attach]8203[/attach]

如果哪位有更好的办法,麻烦回帖告知{:loveliness:}

hyperhe 发表于 2021-10-25 14:44

大佬,请问怎么修改坐标轴上点的距离啊?
在排版试卷结果发现大小不太符合{:sad:}
[attach]10554[/attach]

kuing 发表于 2021-10-25 15:16

[b]回复 [url=http://kuing.orzweb.net/redirect.php?goto=findpost&pid=41596&ptid=4319]18#[/url] [i]hyperhe[/i] [/b]

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

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.