4719 4

[网帖精选] 【干货】用python绘出神奇的莫比乌斯环~ [推广有奖]

贵宾

已卖:8651份资源

学术权威

10%

还不是VIP/贵宾

-

TA的文库  其他...

Data Mining

威望
3
论坛币
84087 个
通用积分
5682.7684
学术水平
669 点
热心指数
648 点
信用等级
501 点
经验
8887 点
帖子
3374
精华
20
在线时间
2896 小时
注册时间
2012-11-11
最后登录
2025-12-25

初级学术勋章 初级热心勋章 初级信用勋章 中级学术勋章 中级热心勋章 中级信用勋章 高级学术勋章 高级热心勋章 高级信用勋章

楼主
狂热的爱好者 学生认证  发表于 2014-9-11 19:35:41 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

       昨天写了一篇subplot的练习放到微信公众账号中,想用一个莫比乌斯环的图片作为封面图片,就去维基百科上扒了一个。但是分辨率很低,就想自己绘出一个来。没想到越陷越深,就一起把3D绘图给学习了一遍。

       源代码:https://github.com/gt11799/mobiusband

       莫比乌斯带维基百科http://zh.wikipedia.org/wiki/%E8 ... C%E6%96%AF%E5%B8%A6

       函数已经给出,剩下的就是取值,绘图。要绘3D图,X,Y,Z都得是矩阵。平常的做法就是遍历,给矩阵中的每一个元素赋值,如果取样点为100,那么计算X的赋值次数就是100*100,每次赋值还要计算两次cos()。

     这就要请出今天的明星-numpy。

      numpy是python中的高效数值运算模块。其中包含了各种数学运算,以及array数据类型,这些都是用C写的,如果只是进行少量数值的运算,numpy的性能是低于math的,但是大批量的数值运算,numpy的优势就体现出来了。

     首先介绍的是array数据类型,很像list,但是可以不用迭代,直接运算。


>>> from numpy import *>>> a = array([1,2,3,4])>>> a * 3array([ 3,  6,  9, 12])

这样就可以直接把取样点直接投到函数中得到X的值。


取样也很方便,比如在这个例子中,我们可以这么取v和u:


v = linspace(-1.0, 1.0, num=500, endpoint=True) u = linspace(0, 2*pi, num=500, endpoint=True)

参数分别是(start,stop,number of sample, 是否包含终止数值)


但是array没有append或者add方法,而且,我试了很久,也没有办法把数据一行一行的添加到一个array中,于是我找了list当作中间人。

把运算复杂度低的v迭代,每次计算出全部的u。


for value_v in v:answer.append((1. + value_v / 2. * cos(u/2.)) * cos(u))

要提前把v和u取成array类型,要提前定义answer是list。更高效的是直接在list中迭代,我们可以为X,Y,Z分别建立函数,返回数值array。



def func_x(v, u):    answer = [((1. + value_v / 2. * cos(u/2.)) * cos(u)) for value_v in v]    return array(answer)

其他坐标轴依此类推。


我们已经准备好了所需要材料,就等着下锅了。3Dplot我用的是mpl_toolkits.mplot中的Axes3D模块,这是matplotlib中的一部分。绘图也很简单,我用的是其中的surface方法。


fig = plt.figure()ax = fig.add_subplot(111, projection='3d')surf = ax.plot_surface(X, Y, Z)


先新建一个figure(为了设置dpi),然后以添加子图的形式添加进去就行。这样就已经成型了,提高下dpi


fig = plt.figure(dpi=150)

增加点色彩变化



surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm)

需要从matplotlib中倒入cm,cm模块很有趣,有着很多的色彩变化,可以参考官方文档。我尝试了多种,最后选择是YlOrBr,是yellow or brand,效果图最后会贴出来。



去掉那些黑色曲线


surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm, linewidth=0)

然后还玩了一把透明度alpha,最后发现透明度低一点的好(alpha越小,透明度越高)



surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm, linewidth=0, alpha=0.9)

现在的图z轴太高,造成立体感不明显,于是我们拉长z轴,让图扁平一点。



ax.set_zlim(-2., 2.)



然后去掉坐标轴


plt.axis('off')

如果用show()方法显示图表,然后保存,背景不是透明的,我们可以用figure.save()取保存



fig.savefig('mobiusband.png', transparent=True)

发现图不够清晰,增加dpi



fig.savefig('mobiusband.png', transparent=True, dpi=600)

然后就得到了最终的图了



——————————————

github主页:https://github.com/gt11799

E-mail:gting405@163.com


摘自:[url=]栉风沐雨[/url]



二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:python 莫比乌斯环 Transparent Matplotlib Projection python 源代码 分辨率 图片 文章

已有 1 人评分论坛币 收起 理由
oliyiyi + 16 精彩帖子

总评分: 论坛币 + 16   查看全部评分

If you want something,work for it!

沙发
狂热的爱好者 学生认证  发表于 2014-9-11 21:31:12

藤椅
rmatrix 发表于 2014-9-11 23:09:01 来自手机
狂热的爱好者 发表于 2014-9-11 19:35
昨天写了一篇subplot的练习放到微信公众账号中,想用一个莫比乌斯环的图片作为封面图片,就去维基百 ...
做得很好!

板凳
狂热的爱好者 学生认证  发表于 2014-9-12 23:49:28
rmatrix 发表于 2014-9-11 23:09
做得很好!

报纸
huangfanchang 发表于 2014-9-13 03:29:58
ding
kankan

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-26 20:27