python绘制数学图形(堪比matlab)
OO~
posted @ 2013年5月14日 21:16
in python
, 4158 阅读
在开始之前,我要对latex做一点补充。
上一篇文章中提到了latex绘制流程图,文中给出了一个实例,在具体的应用上也很简单。下面两个网页可能会比较有用,特别是在流程图的绘制上(各类shapes汇总):
http://www.texample.net/tikz/examples/feature/nodes-and-shapes/
流程图判断——菱形,其变扁的方法:
http://bbs.ctex.org/forum.php?mod=viewthread&tid=57980
下面开始今天要说到的主题。matlab固然很牛叉,但是在理解和实现上还是相对复杂的,python利用现有的库,基本可以实现matlab所有的功能,甚至超越之。与前面的文章相对应,python绘图应该主要着眼的是一些比较严谨的数学公式的绘制问题,相对于latex,其图形更加有数学之美。
今天晚上,我又整了一下python的绘图,感觉还是比较方便的,50行不到的代码即可实现比较完美的图形,特别推荐。下面对应的依次是图形和代码:
对应的代码很简单:
#!/usr/bin/python #coding = utf8 import sys import string import numpy as np import matplotlib.pyplot as plt def f_fun(d, k, i): a = (2.0*d)/((2.0*k-i-1.0)*i+2.0*k*(d-k+1.0)) return a def g_fun(d, k, i): a = (2.0*d-2.0*k+i+1.0)*i*1.0/(2.0*d) return a def main(): form = ['ro-', 'b--<', 'g-*', 'y--s', 'c->'] k = 5 d = [9, 8, 7, 6, 5] x = y = [1.0/k] for t in range(5): r = [f_fun(d[t], k, i) for i in range(k-1, -1, -1)] a = [((1.0-g_fun(d[t], k, i)*r[k-i-1])*1.0/(k-i)) for i in range(k-1, 0, -1)] a.append(1.0/k) x.append(r[0]) y.append(a[0]) plt.plot(r, a, form[t], linewidth = 2.0, label = "$d="+str(d[t])+",n=10,k=5$") plt.plot(x, y, linewidth = 1.2, color = 'black') plt.plot([1.0], [1.0/k], 'rs') plt.annotate("MDS point", xy=(1.0, 1.0/k), xycoords = 'data', xytext=(0.8, 0.25), arrowprops=dict(arrowstyle="->", linewidth = 1.2)) #plt.plot([1.0], [1.0/k], 'rs') plt.legend(loc='upper right') plt.title("Storage-Communication tradeoff \n n=10,k=5,d=5~9,B=1MB") plt.ylabel("Storage per node $\\alpha$") plt.xlabel("Bandwidth to repair one node $\\gamma$") plt.grid(True) plt.show() if __name__ == '__main__': main()
2013年5月14日 21:19
作为菜鸟的我,可能在python代码的书写上,还不够简洁,跪求高人指点
2013年5月14日 21:25
老婆做的已经很不错了
2013年5月14日 22:07
世界上大有牛人在啊
2013年5月14日 22:46
已经很好啦。不过 \\ 这个可以用 raw string 的办法来避免。
2013年5月15日 08:31
这个我也想过哦,但是不知道可不可以在“”下面用到raw,不太清楚,所以就使用了这种方法。难道raw string比\\有更多的优势么?
2013年5月15日 11:10
@OO~: raw string 时不用转义,会清晰很多,特别是当你在里边写复杂的正则或者 TeX 时。这就像如果你的字符串里有单引号就使用双引号来包围,如果里边有双引号就使用单引号来包围一样。
2013年5月15日 19:01
恩恩!
2013年5月15日 20:25
@OO~: 突然觉得你好可爱呢 ^_^
2013年5月15日 22:15
嘿嘿