winforms 动态画折线 不用chart_SAST Weekly | TikZ画万物

cae3580e7430404f14aa64a9dec41614.png

SAST weekly 是由电子工程系学生科协推出的科技系列推送,内容涵盖信息领域技术科普、研究前沿热点介绍、科技新闻跟进探索等多个方面,帮助同学们增长姿势,开拓眼界,每周更新,欢迎关注!欢迎愿意分享知识的同学投稿至 eesast@mail.tsinghua.edu.cn , 期待你的作品!

TikZ是什么?TikZ ist kein Zeichenprogramm(TikZ不是一个绘图程序)是TikZ的递归式缩写。PGF/TikZ是一对画矢量图的语言,也是LaTeX的一个宏包,理论上能绘制任何能精确表示的矢量图,它的作者也是beamer的作者。其中PGF指Portable Graphics Format(类似于PDF),而TikZ是基于之的一套前端。

然而它的文档现在有一千三百多页……笔者实在也不怎么会用它,只能抛砖引玉,做一些粗略的介绍。

先来看一些例子来获取一些直观的印象吧。它有多么强大?

可以有几何图形

526936592e2c4dacf0022a4f945b28fa.png

也可以有mindmap

346669746d148d55029618e3502673fc.png

还可以画电路图

571f9121c7024806d4e3e905b4b06e3b.png

限于篇幅就不放更多例子了。以上这些例子都来源于http://www.texample.net,其中有许许多多的分好类的例子及源代码。大家想必都很有利用开源代码(复制粘贴修改)的经验,现在就可以假装自己学会这个强大的工具了。

899b7129972dfa4ed2cced1b413d83f7.gif

当然分割线之下还是要稍微介绍一下基本操作的。

7b930f4b823ffdb97a3826e6b209d011.png e699bc956d4cb5dc3a471444b23b2080.png

这是文档里的第一个例子,实现了如右的效果。

先导入tikz宏包,然后begin一个tikzpicture,就可以开始通过坐标draw出折线了(坐标可以继续接以绘制一条路径,如\tikz \draw (-1.5,0) -- (1.5,0) -- (0,-1.5) -- (0,1.5);)。(也可以通过\tkiz在tikzpicture环境之外单独地draw,例如\tikz \draw (0,-1.5) -- (0,1.5);)。另外,可以在\draw后接方括号调整基本的属性,如\draw[rounded corners=8pt]还可以把折角变为圆角。具体的其它属性可以自行翻阅文档或查看好看的例子。

学会了画折线,怎么画曲线呢?

TikZ有个诡异的通过控制点画曲线的方法。

48bf56ee8eaef112103dc64a88c726e6.png

上面这个例子中,\draw (0,0) .. controls (1,1) and (2,1) .. (2,0); 这一条语句实现了画出图中曲线的功能。这其中的逻辑是这样的:从(0,0)出发,切线方向指向(1,1),终点(2,0),终点处切线指向(2,1)。

通过..可以连接多个这样的控制语句。

例如如下语句画出了圆……可以自行验证。

\draw (-1,0) .. controls (-1,0.555) and (-0.555,1)

 .. (0,1).. controls (0.555,1) and (1,0.555) .. (1,0);

从数学上来说,通过这样的方式还是能画出绝大多数的代数曲线的。

代数曲线也可以用to来绘制,例如如下的语句是从(0,0)到(2,1.5)的一条曲线,其中起点出发时切线角度90°,终点结束时是195°的切线。

\draw (0,0) to [out=90,in=195] (2,1.5);

但是我们为啥不用\draw (0,0) circle [radius=10pt];直接画圆呢?circle还可以换成rectangle,ellipse,这样就能画出很多基本图形了。另外地,我们可以用plot来绘制函数图像。

用如上方式理论上就能画出几乎所有矢量图了。

此外还有诸如text、image、pattern等基本功能大家也可以自行探索。

899b7129972dfa4ed2cced1b413d83f7.gif 735bfcfc283bc61005dee1027d37c123.png

道理上来说,熟练掌握Matlab/Mathematica的你可以写一段代码描点了。当然大部分事情并没有这么复杂。总结一下,我们学习了画折线(使用--),画曲线(.. controls或者to),调整图像属性(使用方括号[]),以及很多基本图像与函数的绘制方法。

Matlab、Matplotlib和GeoGebra这些优秀的软件甚至可以直接生成TikZ代码,例如:

https://github.com/matlab2tikz/matlab2tikz

https://pypi.org/project/matplotlib2tikz/

https://github.com/nschloe/tikzplotlib

这大大简化了代码的复杂程度。至于为什么要把图导出成TikZ代码,笔者认为矢量图实在是好文明……

只使用本文中介绍到的功能是大大浪费了这个宏包的,而要面面俱到实在是不可能的任务。

不过放着这么详细的文档不看实在是一种浪费。

http://mirrors.ustc.edu.cn/CTAN/graphics/pgf/base/doc/pgfmanual.pdf

上述链接即是优秀的文档,看着这么详细的目录,几乎你想要画的东西都有详细的说明与demo。使用别人造好的轮子,你可以轻松画出各种好看的图。

它有哪些库?我们看看wiki上的介绍:

78808444767cd2a882dbc52f5bee5876.png

实在是有很多功能强大的库,笔者就是看着别人画的漂亮的自动机了解到的这个工具。

不试试在数算的书面作业中用用它么?

5cf4b415a1313b1825b963b7c5d55366.png

或者用它画一画电路图?笔者也不知道啥时候需要用它来画电路图……反正好看就是了。这里可以看见,我们在环境中可以引入很多属性,以绘制指定规范的电路图。另外,笔者踩了一个坑……circuitikz和tikz这两个宏包还是不要混用的为妙。

aa940c3962ba34526a11eff2f78097c2.png

当然如果你觉得这个文档太长了(反正笔者是这么觉得的),这里有一个非常简短的入门教程:

https://cremeronline.com/LaTeX/minimaltikz.pdf

另外,https://github.com/xiaohanyu/awesome-tikz上列出了极其详尽的学习资源,包括视频、文档等资源。(反正看不完)

反正面向搜索引擎和例子干就是了。

899b7129972dfa4ed2cced1b413d83f7.gif

说点题外话,转载一个研究。

96e3e7c0c5f734f5f98d71a9e71325ff.png

划重点:We show that LaTeX users were slower than Word users, wrote less text in the same amount of time, and produced more typesetting, orthographical, grammatical, and formatting errors. On most measures, expert LaTeX users performed even worse than novice Word users. LaTeX users, however, more often report enjoying using their respective software.

写了这些内容之后,笔者觉着这玩意儿的确很难用……写起来效率实在不高。但是enjoy就完事了,毕竟画出好看而专业的图实在是一件很快乐的事。笔者自己也好像已经有一段时间没有用过LaTeX了,它自有它自己的应用场景。了解了这个工具,说不定什么时候就排上用场了呢2333

总之TikZ画万物。

899b7129972dfa4ed2cced1b413d83f7.gif

参考资料:

https://cremeronline.com/LaTeX/minimaltikz.pdf

http://mirrors.ustc.edu.cn/CTAN/graphics/pgf/base/doc/pgfmanual.pdf

http://www.texample.net

https://en.wikipedia.org/wiki/PGF/TikZ

17f43a72380b494ff1204980859164d9.png

撰稿人:马啸阳

审稿人:孙志尧

5f0102ee76f3f3807d09bc0533d7a819.png
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值