这才是程序员的元宵节打开方式:亲手做一盏花灯!

2022 年 2 月 15 日 CSDN

作者 | 许向武        责编 | 张红月
出品 | CSDN(ID:CSDNnews)

又是一年元宵节,作为程序员的你,打算怎么过呢?如果昨天情人节的红包发得手软又心疼,不妨静下心来,了解一下三维数据可视化,顺便做一盏花灯送给女朋友,也许比红包更能讨她欢心呢。


准备


三维数据快速可视化工具,我喜欢用WxGL。这是一个基于PyOpenGL的三维数据可视化库,提供类似Matplotlib风格的3D绘图函数。如果熟悉NumPy和Matplotlib的话,只需要几分钟时间就可以学会使用WxGL的交互式绘图。

WxGL模块使用pip命令安装。

pip install wxgl

安装完成后,可以在Python IDLE中查看版本信息。

>>> import wxgl>>> wxgl.version'0.8.5'

快速体验


元宵、花灯和月亮,是元宵节的三大主题元素。我们就以一个文艺范儿的月亮开启WxGL的体验之旅吧。

import wxgl.wxplot as plt
plt.title('江天一色无纤尘,皎皎空中孤月轮')plt.uvsphere((0,0,0), 1, lon=(0,360), lat=(90,-90), texture='res/moon.jpg', light=None)plt.text('众里寻他千百度,', pos=(1.2,-0.3,0), size=128)plt.text('蓦然回首,', pos=(1.2,-0.5,0), size=128)plt.text('那人却在灯火阑珊处。', pos=(1.2,-0.7,0), size=128)plt.show()

这几行代码,使用uvsphere球面函数绘制了一个中心点在三维坐标系原点、半径为1的月亮。忽略模块名的话,这些代码和Matplotlib的风格几乎是完全一致的,甚至函数名都是相同的。

运行show函数会弹出一个窗口,显示绘制的模型。窗口底部提供了一组工具按钮,可以设置系统参数、切换画布风格、显示或隐藏坐标网格、播放动画、保存或录制屏幕等。和Matplotlib一样,该窗口将阻塞程序运行,直至关闭该窗口。


模型动画


通过transform参数传递一个以时间长度为参数的函数给uvsphere球面函数,就可以让上面的月亮转动起来。

import wxgl.wxplot as plt
plt.title('江天一色无纤尘,皎皎空中孤月轮')plt.uvsphere((0,0,0), 1, lon = (0,360), lat = (90,-90), texture = 'res/moon.jpg', transform = lambda duration : ((0, 1, 0, (0.02*duration)%360),), light = None # 关闭灯光效果,环境光会自动增强)plt.text('众里寻他千百度,', pos=(1.2,-0.3,0), size=128)plt.text('蓦然回首,', pos=(1.2,-0.5,0), size=128)plt.text('那人却在灯火阑珊处。', pos=(1.2,-0.7,0), size=128)plt.show()

代码中lambda函数——当然也可以是普通的函数,其参数duration是以毫秒为单位的时间长度。该函数返回月球围绕一个向量(此处为(0,1,0),即y轴)旋转的角度。点击播放按钮,月球即开始以20°/s的速度旋转。

对了,差点儿忘记提供月球的纹理图片了。

子图布局


在一张画布上可以任意放置多个子图。下面的代码演示了子图布局函数subplot的经典用法。实际上,这个函数比Matplotlib的同名函数更灵活和便捷。

import wxgl.wxplot as pltplt.subplot(121)plt.title('经纬度网格生成球体')plt.uvsphere((0,0,0), 1, color='coral', fill=False, slices=15)plt.subplot(122)plt.title('正八面体迭代细分生成球体')plt.isosphere((0,0,0), 1, color='cyan', fill=False, iterations=2)plt.show()

在画布上创建两个子图,使用两种不同的方式绘制球,并设置填充模式。由于使用相同的视点系统,两个子图上的模型可以保持同步。

颜色映射


对于数据快速可视化工具来说,颜色映射是必不可少的。下面的代码演示了ColorBar的用法。代码中的jet、Paired、rainbow等颜色映射表继承自Matplotlib库。

import numpy as npimport wxgl.wxplot as plt
vs = np.random.random((300, 3))*2-1color = np.random.random(300)size = np.random.randint(3, 15, size=300)plt.scatter(vs, color, 'jet', size=size)plt.colorbar('jet', [-1, 1], loc='right')plt.colorbar('Paired', [-5, 5], loc='bottom', subject='温度')plt.colorbar('rainbow', [0, 77], loc='bottom', subject='速度')plt.title('scatter函数和colorbar函数示例')plt.show()

WxGL允许在一张图上使用两个垂直风格的ColorBar和三个水平风格的ColorBar。

走马灯


去年元宵节我写过一篇绘制3D花灯的博客,用的工具也是WxGL,当时的版本还是0.6.4。牛去虎来,整整一年过去了,WxGL终于艰难地升级到了0.8.5,那篇博客中的代码也必须要升级了。

import numpy as npimport wxgl.wxplot as plt
r = 1 # 花灯半径为1tf_bull = lambda duration : ((0, 1, 0, (0.02*duration)%360),) # 模型动画函数
# 以下生成花灯筒状龙骨theta = np.linspace(0, 2*np.pi, 361) # 在0°~360°范围内间隔1°均匀生成361个角度xs = r * np.tile(np.cos(theta), (150,1)) # 半径为r的圆周上361点的x坐标,重复150次,得到150行361列的二维数组zs = r * np.tile(-np.sin(theta), (150,1)) # 半径为r的圆周上361点的z坐标,重复150次,得到150行361列的二维数组ys = np.repeat(np.linspace(2.7, 0, 150), 361).reshape(150,361) # 0~2.7范围内均匀生成150个点,每个重复361,得到150行361列的二维数组
# 以下生成花灯叶轮theta = np.linspace(0, 2*np.pi, 18, endpoint=False)x, z = r * np.cos(theta), r * np.sin(theta)y = np.ones(18) * 2.5x[2::3] = x[1::3]x[1::3] = 0z[2::3] = z[1::3]z[1::3] = 0vs = np.stack((x,y,z), axis=1)
# 公牛动画函数:顺时针旋转,20°/s,向左平移1.2tf_bull = lambda duration : ((0, 1, 0, (-0.02*duration)%360), (-1.2,0,0))
# 老虎动画函数:逆时针旋转,20°/s,向右平移1.2tf_tiger = lambda duration : ((0, 1, 0, (0.02*duration)%360), (1.2,0,0))

plt.figure(elev=20) # 设置相机高度角为20°
# 公牛花灯plt.mesh(xs, ys, zs, texture='res/bull.jpg', transform=tf_bull, light=None) # 花灯筒plt.surface(vs, color=(0.75,0.2,0,0.8), transform=tf_bull) # 花灯叶轮plt.uvsphere((0,0.8,0), 0.4, color='#FFFFFF', transform=((-1.2,0,0),), light=None) # 灯plt.line([[0,1.2,0],[0,3.5,0]], color='red', width=3.0, transform=((-1.2,0,0),), inside=False) # 线
# 老虎花灯plt.mesh(xs, ys, zs, texture='res/tiger.jpg', transform=tf_tiger, light=None) # 花灯筒plt.surface(vs, color=(0.75,0.2,0,0.8), transform=tf_tiger) # 花灯叶轮plt.uvsphere((0,0.8,0), 0.4, color='#FFFFFF', transform=((1.2,0,0),), light=None) # 灯plt.line([[0,1.2,0],[0,3.5,0]], color='red', width=3.0, transform=((1.2,0,0),), inside=False) # 线
plt.show()

两只花灯使用相同的尺寸,画在同一个位置。花灯筒和叶轮的模型动画函数除了旋转还分别向左右移动了1.2个长度单位,而灯和线则只移动不旋转。最终效果如下图所示。

代码中用的公牛和老虎的花灯纹理

新程序员003》正式上市,50余位技术专家共同创作,云原生和数字化的开发者们的一本技术精选图书。内容既有发展趋势及方法论结构,华为、阿里、字节跳动、网易、快手、微软、亚马逊、英特尔、西门子、施耐德等30多家知名公司云原生和数字化一手实战经验!


   
   
     
滴滴被曝大裁员;知乎回应从未使用员工行为感知系统;全新iMac Pro将在今年6月发布|极客头条
☞IntelliJ 平台彻底停用 Log4j 组件!
从1750亿到1.6万亿,人工智能未来:除了大模型,还有什么?

登录查看更多
0

相关内容

Matplotlib是Python最著名的数据可视化工具包,有了它,一些统计上常用的图形如折线图、散点图、直方图等都可以用简单的几行Python代码实现。
【简明书】图数据库傻瓜式入门,51页pdf
专知会员服务
68+阅读 · 2022年3月26日
【2021新书】《用正确的方式学Python》,456页pdf
专知会员服务
77+阅读 · 2021年6月9日
【干货书】Python参考手册,210页pdf
专知会员服务
63+阅读 · 2021年4月30日
【干货书】利用 Python 进行数据分析,470页pdf
专知会员服务
112+阅读 · 2021年3月13日
专知会员服务
91+阅读 · 2020年12月26日
【2020新书】实战R语言4,323页pdf
专知会员服务
100+阅读 · 2020年7月1日
【实用书】学习用Python编写代码进行数据分析,103页pdf
专知会员服务
194+阅读 · 2020年6月29日
【新书】傻瓜式入门深度学习,371页pdf
专知会员服务
188+阅读 · 2019年12月28日
程序员笑话集锦:丈夫与妻子篇
CSDN
0+阅读 · 2022年4月12日
实操教程|CUDA WarpReduce 学习笔记
极市平台
1+阅读 · 2022年4月6日
元宵节快乐!
CCF计算机安全专委会
0+阅读 · 2022年2月15日
如何用OpenGL绘制雪花?
CSDN
0+阅读 · 2022年2月7日
家人不在身边,怎么过年?
InfoQ
0+阅读 · 2022年1月29日
如何在golang代码里面解析容器镜像
阿里技术
0+阅读 · 2022年1月5日
手把手教TensorFlow(附代码)
深度学习世界
15+阅读 · 2017年10月17日
国家自然科学基金
0+阅读 · 2014年12月31日
国家自然科学基金
3+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
1+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2011年12月31日
国家自然科学基金
0+阅读 · 2011年12月31日
国家自然科学基金
0+阅读 · 2011年12月31日
国家自然科学基金
0+阅读 · 2011年12月31日
国家自然科学基金
0+阅读 · 2009年12月31日
Arxiv
0+阅读 · 2022年4月20日
Arxiv
1+阅读 · 2022年4月19日
Arxiv
2+阅读 · 2022年4月19日
Arxiv
1+阅读 · 2022年4月18日
VIP会员
相关VIP内容
【简明书】图数据库傻瓜式入门,51页pdf
专知会员服务
68+阅读 · 2022年3月26日
【2021新书】《用正确的方式学Python》,456页pdf
专知会员服务
77+阅读 · 2021年6月9日
【干货书】Python参考手册,210页pdf
专知会员服务
63+阅读 · 2021年4月30日
【干货书】利用 Python 进行数据分析,470页pdf
专知会员服务
112+阅读 · 2021年3月13日
专知会员服务
91+阅读 · 2020年12月26日
【2020新书】实战R语言4,323页pdf
专知会员服务
100+阅读 · 2020年7月1日
【实用书】学习用Python编写代码进行数据分析,103页pdf
专知会员服务
194+阅读 · 2020年6月29日
【新书】傻瓜式入门深度学习,371页pdf
专知会员服务
188+阅读 · 2019年12月28日
相关资讯
程序员笑话集锦:丈夫与妻子篇
CSDN
0+阅读 · 2022年4月12日
实操教程|CUDA WarpReduce 学习笔记
极市平台
1+阅读 · 2022年4月6日
元宵节快乐!
CCF计算机安全专委会
0+阅读 · 2022年2月15日
如何用OpenGL绘制雪花?
CSDN
0+阅读 · 2022年2月7日
家人不在身边,怎么过年?
InfoQ
0+阅读 · 2022年1月29日
如何在golang代码里面解析容器镜像
阿里技术
0+阅读 · 2022年1月5日
手把手教TensorFlow(附代码)
深度学习世界
15+阅读 · 2017年10月17日
相关基金
国家自然科学基金
0+阅读 · 2014年12月31日
国家自然科学基金
3+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
1+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2011年12月31日
国家自然科学基金
0+阅读 · 2011年12月31日
国家自然科学基金
0+阅读 · 2011年12月31日
国家自然科学基金
0+阅读 · 2011年12月31日
国家自然科学基金
0+阅读 · 2009年12月31日
Top
微信扫码咨询专知VIP会员