文章目录

  • 1 准备
  • 2 快速体验
  • 3 模型动画
  • 3 子图布局
  • 4 颜色映射
  • 5 走马灯

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

1 准备

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

WxGL模块使用pip命令安装。

pip install wxgl

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

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

2 快速体验

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

import wxgl.wxplot as pltplt.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一样,该窗口将阻塞程序运行,直至关闭该窗口。

3 模型动画

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

import wxgl.wxplot as pltplt.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的速度旋转。

对了,差点儿忘记提供月球的纹理图片了。点击此处可下载不带水印的月球纹理图片。

3 子图布局

在一张画布上可以任意放置多个子图。下面的代码演示了子图布局函数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()

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

4 颜色映射

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

import numpy as np
import wxgl.wxplot as pltvs = np.random.random((300, 3))*2-1
color = 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。

5 走马灯

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

import numpy as np
import wxgl.wxplot as pltr = 1 # 花灯半径为1
tf_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.5
x[2::3] = x[1::3]
x[1::3] = 0
z[2::3] = z[1::3]
z[1::3] = 0
vs = np.stack((x,y,z), axis=1)# 公牛动画函数:顺时针旋转,20°/s,向左平移1.2
tf_bull = lambda duration : ((0, 1, 0, (-0.02*duration)%360), (-1.2,0,0)) # 老虎动画函数:逆时针旋转,20°/s,向右平移1.2
tf_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个长度单位,而灯和线则只移动不旋转。最终效果如下图所示。

代码中用的公牛和老虎的花灯纹理,请点击下载:公牛、老虎。


这才是程序员的元宵节打开方式:亲手做一盏花灯,轻松学三维绘图相关推荐

  1. adb命令怎么打开_用python撸支付宝体验金,才是程序员正确的打开方式!

    支付宝近期推出了余额宝体验金活动,这个活动有两个部分一个是邀请好友赢推荐金,另一个是鲤鱼跃龙门,点击越快体验金金额越高. 今天讲讲怎么自动化实现快速点击加速增加我们的鲤鱼跃龙门的体验金额,实现的方法有 ...

  2. python实现登录支付宝收能量_用python撸支付宝体验金,才是程序员正确的打开方式...

    支付宝近期推出了余额宝体验金活动,这个活动有两个部分一个是邀请好友赢推荐金,另一个是鲤鱼跃龙门,点击越快体验金金额越高. 今天讲讲怎么自动化实现快速点击加速增加我们的鲤鱼跃龙门的体验金额,实现的方法有 ...

  3. 左潇龙_你首先是一个人,然后你才是程序员。

    原文地址:https://blog.csdn.net/zuoxiaolong8810/article/details/65441785 写这篇文章,其实是源自于当时在简书上,一个简友简信的内容. 当时 ...

  4. 你首先是一个人,然后你才是程序员。

    引言 写这篇文章,其实是源自于当时在简书上,一个简友简信的内容. 当时这个简友问了群主一个非常少见的问题,"LZ,你平时是如何保养你的皮肤的." 看完这个,LZ忍不住乐了,过后还拿 ...

  5. 转载《你首先是一个人,然后你才是程序员》——左潇龙

    转载<你首先是一个人,然后你才是程序员>--左潇龙 感触真的很多,解答了部分自己的疑惑

  6. 程序员被空姐骗到香港做传销!(当事人讲述完整详细版)

    黑客技术 点击右侧关注,了解黑客的世界! Java开发进阶 点击右侧关注,掌握进阶之路! Python开发 点击右侧关注,探讨技术话题! 作者丨纯洁的微笑 来源丨纯洁的微笑(keeppuresmile ...

  7. 十个炫丽的表白模板源码,整合成一个完整系统可修改文字,可统计人数,经典的爱情告白,万能告白模板,胜过鲜花表白,程序员的特殊表白方式说——我爱你(520)——html、js、css、jQuery

    十个炫丽的表白模板源码,整合成一个完整系统可修改文字,可统计人数,经典的爱情告白,万能告白模板,胜过鲜花表白,程序员的特殊表白方式说--我爱你(520)--html.js.css.jQuery. 一. ...

  8. 程序员:多用吐槽的时间做点实际的事情

    不好意思,如果图片不能查看,请访问 下面地方查看,谢谢! 程序员:多用吐槽的时间做点实际的事情 昨天晚上很晚才睡觉,夜深的时候,静下心来,想想这一天,也想想这一年. 也就在昨晚加入一个知识星球,&qu ...

  9. 小心!程序员被空姐骗到香港做传销!

    作者 | 纯洁的微笑 本文经授权转载自纯洁的微笑(ID: keeppuresmile) 2019年 7 月 11 下午 7:47 我收到一个读者的微信信息,内容如下: 这个读者是我知识星球的用户,看出 ...

  10. 程序员的“我爱你”表达方式

    程序员的"我爱你"表达方式 Question 我刚从一个我喜欢的.却还无法得到她的心的女孩那里获得一个灵感,因此我提出了这个问题. 她是我的灵感源之泉. Sorry for the ...

最新文章

  1. elementui tree组件层级过多时可左右滚动
  2. java定义一个指针类型变量赋值吗,C++中指针的数据类型和运算相关知识小结
  3. 30分钟3300%性能提升—python+memcached网页优化小记
  4. 自定义注解--Annotation
  5. MyBatis generator 使用方式 小结
  6. Android中Dialog对话框
  7. android开发01 --开发工具
  8. 怎么用计算机撩人,如何用你的专业“撩人”?
  9. 南京邮电大学离散数学实验一:利用真值表法求取主析取范式以及主合取范式的实现
  10. o2o电商模式的创业机会有哪些?
  11. 陶森大学计算机专业收入水平,2020PayScale计算机专业本科薪水排行
  12. 计算机应用基础网上作业2,华东理工 计算机应用基础(本)网上作业2
  13. EasyRecovery最新版本Photo16电脑数据恢复软件下载
  14. 微信小程序下载图片到本地
  15. 交换机基础知识和VLAN概述
  16. Nature重磅:软硬分离、图灵完备,清华首次提出“类脑计算完备性”
  17. npm ERR code1
  18. ffmpeg 合并视频 添加字幕 bat命令
  19. IDA Pro 7.6 with M1 Max on wine+py3.8
  20. 快速绘图,不可不知的CAD经典技巧!

热门文章

  1. Centos7+DockerCompose部署.NetCore3.1应用
  2. html鼠标悬停图片抖动,鼠标悬停时图像抖动
  3. 截止失真放大电路_基本放大电路应该如何分析?
  4. 用wget命令从FTP服务器下载数据
  5. 感觉媒体、表示媒体、表现媒体、存储媒体和传输媒体
  6. Win10 系统C盘 容量变大,如何清理,亲测有效
  7. div网页布局(做一个简单网页界面为例)
  8. C语言数字图像处理---1.6图像亮度对比度调节
  9. 查询结果按中文拼音顺序排序
  10. 前端之JS篇(七)——Web APIsDOM部分内容