📜  3d 绘图 - Python (1)

📅  最后修改于: 2023-12-03 14:59:05.131000             🧑  作者: Mango

3D 绘图 - Python

概述

Python 是一种功能强大的编程语言,可以广泛应用于多种领域,包括数据科学、计算机视觉、深度学习等。在图形学方面,Python 也有很多优秀的库和工具,使其能够进行 3D 绘图。

一些流行的 3D 绘图库包括:

  • matplotlib
  • Mayavi
  • Plotly
  • PyVista
  • VisPy
  • PyOpenGL
matplotlib

matplotlib 是 Python 中最著名的绘图库之一,并具有绘制 3D 图形的功能。其中,mpl_toolkits.mplot3d 模块提供了与 3D 绘图相关的类和函数。

下面是一个例子:

from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

x = np.random.standard_normal(100)
y = np.random.standard_normal(100)
z = np.random.standard_normal(100)

ax.scatter(x, y, z)

plt.show()

输出结果如下:

matplotlib 3D scatter plot

Mayavi

Mayavi 是一款功能强大的科学数据可视化工具,支持许多 3D 绘图功能。它是由 Enthought 开发的,能够与 NumPy 和 SciPy 集成。

这里是一个简单的例子,绘制一个球体:

from mayavi import mlab

# Create a figure
mlab.figure()

# Create a 3D scalar field
x, y, z = mgrid[-5:5:100j, -5:5:100j, -5:5:100j]
f = x**2 + y**2 + z**2

# Create a surface plot of the scalar field
mlab.contour3d(f)

# Show the plot
mlab.show()

输出结果如下:

Mayavi 3D contour plot

Plotly

Plotly 是一款交互式数据可视化工具,支持许多绘图类型,包括 3D 绘图。它支持 Python 和其他语言,包括 R 和 JavaScript。

下面是一个简单的例子:

import plotly.graph_objs as go

# Define the data
x = [1, 2, 3, 4]
y = [2, 4, 8, 16]
z = [4, 8, 16, 32]

# Create a 3D scatter plot
trace = go.Scatter3d(x=x, y=y, z=z, mode='markers')

# Define the layout
layout = go.Layout(title='3D Scatter Plot')

# Create the figure
fig = go.Figure(data=[trace], layout=layout)

# Show the plot
fig.show()

输出结果如下:

Plotly 3D scatter plot

PyVista

PyVista 是一个功能强大的 3D 可视化库,可用于科学数据可视化、仿真等领域。它支持许多常用格式的数据导入、网格剖分、显式和隐式绘图等。

下面是一个简单的例子:

import pyvista as pv

# Create a mesh
mesh = pv.Sphere()

# Plot the mesh
mesh.plot()

输出结果如下:

PyVista 3D sphere plot

VisPy

VisPy 是一个高性能的交互式可视化库,适用于 OpenGL 2 和 3 环境下的数据可视化。它的设计目标是支持大规模和高精度的数据集,同时提供丰富的 3D 绘图功能。

下面是一个简单的例子:

import numpy as np
import vispy.scene
from vispy.scene import visuals

# Create a canvas
canvas = vispy.scene.SceneCanvas(keys='interactive', show=True)

# Create a grid of points
x, y, z = np.mgrid[:10, :10, :10] * 0.1 - 0.5
pos = np.empty((1000, 3), dtype=np.float32)
pos[:, 0] = x.ravel()
pos[:, 1] = y.ravel()
pos[:, 2] = z.ravel()

# Create a sphere visual
sphere = visuals.Markers()
sphere.set_data(pos, edge_color=None, face_color=(1, 0, 0), size=3)

# Add the sphere to the canvas
canvas.view.add(sphere)

# Run the event loop
vispy.app.run()

输出结果如下:

VisPy 3D sphere plot

PyOpenGL

PyOpenGL 是 Python 编程语言的开源实现,支持 OpenGL 标准。它是一款功能强大的 3D 编程工具,用于创建和渲染 3D 图形和动画。

以下是一个使用 PyOpenGL 绘制简单正方体的示例:

from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *

# Define the vertices of a cube
vertices = (
    (1, -1, -1),
    (1, 1, -1),
    (-1, 1, -1),
    (-1, -1, -1),
    (1, -1, 1),
    (1, 1, 1),
    (-1, -1, 1),
    (-1, 1, 1)
)

# Define the edges of a cube
edges = (
    (0, 1),
    (0, 3),
    (0, 4),
    (2, 1),
    (2, 3),
    (2, 7),
    (6, 3),
    (6, 4),
    (6, 7),
    (5, 1),
    (5, 4),
    (5, 7)
)

def draw_cube():
    # Draw the edges of the cube
    glBegin(GL_LINES)
    for edge in edges:
        for vertex in edge:
            glVertex3fv(vertices[vertex])
    glEnd()

def display():
    # Clear the screen
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)

    # Set the projection matrix
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    gluPerspective(45, 1, 0.1, 50)

    # Set the modelview matrix
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    gluLookAt(3, 3, 3, 0, 0, 0, 0, 1, 0)

    # Draw the cube
    glColor3f(1, 1, 1)
    glEnable(GL_DEPTH_TEST)
    draw_cube()

    # Swap the buffers
    glutSwapBuffers()

def init():
    # Enable antialiasing
    glEnable(GL_BLEND)
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
    glEnable(GL_LINE_SMOOTH)
    glEnable(GL_POINT_SMOOTH)
    glHint(GL_LINE_SMOOTH_HINT, GL_NICEST)
    glHint(GL_POINT_SMOOTH_HINT, GL_NICEST)

    # Set the background color
    glClearColor(0.2, 0.2, 0.2, 0)

    # Set the viewport
    glViewport(0, 0, 400, 400)

def main():
    # Initialize GLUT
    glutInit()
    glutInitDisplayMode(GLUT_RGBA|GLUT_DEPTH|GLUT_DOUBLE)

    # Create the window
    glutCreateWindow('OpenGL Cube')

    # Register the display function
    glutDisplayFunc(display)

    # Initialize OpenGL
    init()

    # Run the event loop
    glutMainLoop()

if __name__ == '__main__':
    main()

输出结果如下:

PyOpenGL 3D cube plot

总结

Python 提供了许多强大的 3D 绘图工具和库,可以满足不同领域或需求的绘图要求。其中一些库提供非常高级的功能,如支持大规模和高精度的数据集、交互式绘图和动画等。如果您需要进行 3D 绘图,请尝试使用其中的某个库,它们中的许多都已在实践中得到了广泛的应用。