文章目录
- 创建3D柱状图
- 三翼面图(双曲面抛物线)
- 绘制3D直方图
- 在matplotlib中创建动画
- 用OpenGL制作动画
- Mayavi安装
- 简单实现带旋转图形的窗口
- 简单示例—pyglet
创建3D柱状图
import random
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rcParams['font.size'] = 10
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
for z in [2011, 2012, 2013, 2014]:
# xs和ys是x轴和y轴坐标;zs是z轴的坐标值,可以是所有点对应一个值
# 或者是每个点对应一个值;zdir决定那个坐标轴作为z轴的维度
xs = range(1, 13)
ys = 1000 * np.random.rand(12)
color = plt.cm.Set2(random.choice(range(plt.cm.Set2.N)))
ax.bar(xs, ys, zs=z, zdir='y', color=color, alpha=0.8)
ax.xaxis.set_major_locator(mpl.ticker.FixedLocator(xs))
ax.yaxis.set_major_locator(mpl.ticker.FixedLocator(ys))
ax.set_xlabel('Month')
ax.set_ylabel('Year')
ax.set_zlabel('Sales Net [usd]')
plt.show()
三翼面图(双曲面抛物线)
from matplotlib import cm
import matplotlib.pyplot as plt
import numpy as np
n_angles = 36
n_radii = 8
# 半径的数组,不包括半径r=0,这是为了消除重复点
radii = np.linspace(0.125, 1.0, n_radii)
# 角度的数组
angles = np.linspace(0, 2 * np.pi, n_angles, endpoint=False)
# 为每个半径重复所有的角度
angles = np.repeat(angles[..., np.newaxis], n_radii, axis=1)
# 转换极坐标(半径,角度)坐标到笛卡尔坐标(x, y)坐标
# (0,0)在这里添加。(x, y)平面上没有重复的点
x = np.append(0, (radii * np.cos(angles)).flatten())
y = np.append(0, (radii * np.sin(angles)).flatten())
# Pringle surface
z = np.sin(-x * y)
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot_trisurf(x, y, z, cmap=cm.jet, linewidth=0.2)
plt.show()
绘制3D直方图
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D
mpl.rcParams['font.size'] = 10
samples = 25
x = np.random.normal(5, 1, samples)
y = np.random.normal(3, .5, samples)
fig = plt.figure()
ax = fig.add_subplot(211, projection='3d')
# 计算二维直方图
hist, xedges, yedges = np.histogram2d(x, y, bins=10)
# 计算x,y空间的位置
elements = (len(xedges) - 1) * (len(yedges) - 1)
xpos, ypos = np.meshgrid(xedges[:-1] + .25, yedges[:-1] + .25)
xpos = xpos.flatten()
ypos = ypos.flatten()
zpos = np.zeros(elements)
# 使每个bar有相同的宽度
dx = .1 * np.ones_like(zpos)
dy = dx.copy()
# bar的高度
dz = hist.flatten()
ax.bar3d(xpos, ypos, zpos, dx, dy, dz, color='b', alpha=0.4)
ax.set_xlabel('X Axis')
ax.set_ylabel('Y Axis')
ax.set_zlabel('Z Axis')
# 散点图中绘制相同的x、y相关以作比较
ax2 = fig.add_subplot(212)
ax2.scatter(x, y)
ax2.set_xlabel('X Axis')
ax2.set_ylabel('Y Axis')
plt.show()
在matplotlib中创建动画
动画框架主要的类是matplotlib.animation.Animation,这个类是一个基类,它可以针对不同的行为被子类化。
Animation(object) | 此类用matplotlib创建动画。它仅仅是一个基类,应该被子类化以以提供所需的行为 |
TimeAnimation(Animation) | 这个动画子类支持基于时间的动画,每interval*milliseconds绘制一个新的帧 |
ArtistAnimation(TimeAnimation) | 在调用此函数之前,所有绘制工作应当已经完成,并且相关的artists已经被保存 |
FuncAnimation(TimeAnimation) | 其通过重复地调用一个函数生成动画,可以为函数传入参数,参数是可选的 |
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation
plt.rcParams['animation.ffmpeg_path'] = 'F:\\Python3\\ffmpeg-20190815-3aeb681-win64-static\\bin\\ffmpeg.exe'
fig = plt.figure()
ax = plt.axes(xlim=(0, 2), ylim=(-2, 2))
line, = ax.plot([], [], lw=2)
def init():
"""清空当前帧"""
line.set_data([], [])
return line,
def animate(i):
"""
:param i:帧计数器
:return:int
"""
x = np.linspace(0, 2, 1000)
y = np.sin(2 * np.pi * (x - 0.01 * i) * np.cos(2 * np.pi * (x - 0.01 * i)))
line.set_data(x, y)
return line,
# 这个调用将使工作运行起来,连接init和animate函数并绘制我们想要的图形
anim = animation.FuncAnimation(fig, animate, init_func=init,
frames=200, interval=20, blit=True)
# 这个调用创建视频文件。每帧都保存为PNG文件,然后由ffmpeg编码器处理成MPEG4文件,我们可以通过extra_args将各种参数传递给ffmpeg
FFwriter = animation.FFMpegWriter(fps=20, extra_args=['-vcodec', 'libx264'])
anim.save('basic_animation.mp4', writer=FFwriter)
补充说明:安装与配置ffmpeg:1)ffmepg下载 2)解压到你想要解压的文件夹,复制路径,如下图3)配置环境变量,将复制的路径添加到系统变量Path中,如下图:
4)在命令行中验证安装成功,打开命令行,输入
ffmpeg -version
验证
用OpenGL制作动画
OpenGL是一个规范,而不是一个实现,因此OpenGL本身并没有任何实现代码,所有的实现是遵循该规范而开发的库。这些库是跟随操作系统或者由如NVIDIA或者AMD/ATI等不同的显卡厂商发布的。因为OpenGL是一个图形渲染库,所以它不知道我们在屏幕上绘制的是什么,它不关心我们画的是否是一只猫、一个球或者一条线。因此,要移动一个已经渲染的对象,需要清除并重绘整个图像,为了让某个物体动起来,我们需要很快地循环绘制和重绘所有内容,并把它显示给用户,这样用户就认为其正在观看一个动画。
Mayavi是一个专门用于3D的库;Pyglet是一个纯Python的图形库;Glumpy是一个构建在Numpy之上的快速图形渲染库;Pyglet和OpenGL用来可视化大数据(百万级数据点)
Mayavi可以作为一个开发库/框架,或者一个应用程序来使用。Mayavi应用程序包含了一个可视化编辑器,可以用于简单的数据研究和一些交互可视化。
Mayavi安装
可以仿照安装安装Pygame的博客进行安装,安装步骤是一样的,只是安装的库不同而已。
注意: 需要先安装PyQt4,Traits和VTK,否则直接安装Mayavi会因为缺少必要的依赖而报错,PyQt、Traits和VKT的安装也参考上面的安装Pygame的步骤,这些依赖安装完成就可以安装mayavi了。
简单实现带旋转图形的窗口
import numpy as np
from mayavi.mlab import *
n_mer, n_long = 6, 11
pi = np.pi
dphi = pi / 1000.0
phi = np.arange(0.0, 2 * pi + 0.5 * dphi, dphi, 'd')
mu = phi * n_mer
x = np.cos(mu) * (1 + np.cos(n_long * mu / n_mer) * 0.5)
y = np.sin(mu) * (1 + np.cos(n_long * mu / n_mer) * 0.5)
z = np.sin(n_long * mu / n_mer) * 0.5
l = plot3d(x, y, z, np.sin(mu), tube_radius=0.025, colormap='Spectral')
ms = l.mlab_source
for i in range(100):
x = np.cos(mu) * (1 + np.cos(n_long * mu / n_mer + np.pi * (i + 1) / 5.) * 0.5)
scalars = np.sin(mu + np.pi * (i + 1) / 5)
ms.set(x=x, scalars=scalars)
show()
简单示例—pyglet
视频文件使用上面ffmpeg生成的视频为样例。
import pyglet
from pyglet.media import *
window = pyglet.window.Window()
player = Player()
source = load('basic_animation.mp4')
player.queue(source)
player.play()
print(player.get_texture())
@window.event
def on_draw():
window.clear()
player.get_texture().blit(0, 100)
pyglet.app.run()