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

本文介绍了如何使用Python进行3D数据可视化,包括创建3D柱状图、三翼面图、3D直方图和动画。通过matplotlib库展示了柱状图和三翼面图的绘制,使用ArtistAnimation创建了动画,并简述了OpenGL和Mayavi在3D动画中的应用。最后,给出了一个使用pyglet播放视频的简单示例。
摘要由CSDN通过智能技术生成

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

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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值