文章目录

  • 创建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()

python 渐变三维柱状图 python 3d柱状图_数据可视化

三翼面图(双曲面抛物线)

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()

python 渐变三维柱状图 python 3d柱状图_动画_02

绘制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()

python 渐变三维柱状图 python 3d柱状图_数据可视化_03

在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)

python 渐变三维柱状图 python 3d柱状图_python_04

补充说明:
  安装与配置ffmpeg:
  1)ffmepg下载   2)解压到你想要解压的文件夹,复制路径,如下图

python 渐变三维柱状图 python 3d柱状图_python 渐变三维柱状图_05


  3)配置环境变量,将复制的路径添加到系统变量Path中,如下图:


python 渐变三维柱状图 python 3d柱状图_动画_06


  4)在命令行中验证安装成功,打开命令行,输入

ffmpeg -version

验证


python 渐变三维柱状图 python 3d柱状图_动画_07

用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了。

python 渐变三维柱状图 python 3d柱状图_python 渐变三维柱状图_08

简单实现带旋转图形的窗口

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()

python 渐变三维柱状图 python 3d柱状图_动画_09

简单示例—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()