欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

【Python数据可视化】创建3D可视化图表

程序员文章站 2022-03-02 12:32:54
创建3D柱状图import randomimport numpy as npimport matplotlib as mplimport matplotlib.pyplot as pltmpl.rcParams['font.size'] = 10fig = plt.figure()ax = fig.add_subplot(111, projection='3d')for z in [2011, 2012, 2013, 2014]: # xs和ys是x轴和y轴坐标;zs是z轴的坐标值...

创建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数据可视化】创建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数据可视化】创建3D可视化图表

绘制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数据可视化】创建3D可视化图表

在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数据可视化】创建3D可视化图表

补充说明:
  安装与配置ffmpeg:
  1)ffmepg下载
  2)解压到你想要解压的文件夹,复制路径,如下图
【Python数据可视化】创建3D可视化图表
  3)配置环境变量,将复制的路径添加到系统变量Path中,如下图:
【Python数据可视化】创建3D可视化图表
  4)在命令行中验证安装成功,打开命令行,输入ffmpeg -version验证
【Python数据可视化】创建3D可视化图表

用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数据可视化】创建3D可视化图表

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

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数据可视化】创建3D可视化图表

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

本文地址:https://blog.csdn.net/qq_36477513/article/details/110082285