Matplotlib三维绘图,这一篇就够了

2023-05-16

Matplotlib三维绘图,这一篇就够了

    • 1. 效果图
      • 1.1 3D线效果图
      • 1.2 3D散点效果图
      • 1.3 3D随机颜色散点效果图
      • 1.4 3D散点不同mark点效果图
      • 1.5 3D线框效果图
      • 1.6 3D曲面不透明效果图
      • 1.7 3D曲面透明效果图
    • 2. 源码
    • 参考

这篇博客将介绍使用 mplot3d 工具包进行三维绘图,支持简单的 3D 图形,包括曲面、线框、散点图和条形图。

1. 效果图

1.1 3D线效果图

3D线图效果如下:
可自定义线的颜色及点的样式;
在这里插入图片描述

1.2 3D散点效果图

3D散点图(标记了着色以呈现深度外观)效果如下:

在这里插入图片描述

1.3 3D随机颜色散点效果图

3D随机颜色散点图效果如下:
在这里插入图片描述

1.4 3D散点不同mark点效果图

3D官方散点图不同mark点效果如下:
在这里插入图片描述

1.5 3D线框效果图

3D线框图效果如下:
在这里插入图片描述

1.6 3D曲面不透明效果图

3D曲面图不透明如下:
在这里插入图片描述

1.7 3D曲面透明效果图

3D曲面图透明如下:
在这里插入图片描述

2. 源码

# matplotlib 3D绘图

# 3D 轴(属于 Axes3D 类)是通过将 projection="3d" 关键字参数传递给 Figure.add_subplot 来创建的:
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
import numpy as np

x = np.arange(100)
y = np.random.randint(0, 300, 100)
z = np.random.randint(0, 200, 100)


# 3D线图
def line_3d():
    # 线
    fig = plt.figure()
    ax = fig.add_subplot(projection='3d')

    # c颜色,marker:样式*雪花
    ax.plot(xs=x, ys=y, zs=z, c="y", marker="*")
    plt.show()


# 3D散点图
def scatter_3d():
    # 散点图
    fig = plt.figure()
    ax = fig.add_subplot(projection='3d')

    # s:marker标记的大小
    # c: 颜色  可为单个,可为序列
    # depthshade: 是否为散点标记着色以呈现深度外观。对 scatter() 的每次调用都将独立执行其深度着色。
    # marker:样式
    ax.scatter(xs=x, ys=y, zs=0, zdir='z', s=30, c="g", depthshade=True, cmap="jet", marker="^")
    plt.show()


def randrange(n, vmin, vmax):
    """
    Helper function to make an array of random numbers having shape (n, )
    with each number distributed Uniform(vmin, vmax).
    """
    return (vmax - vmin) * np.random.rand(n) + vmin


# 3D随机颜色散点图
def scatter_random_color_3d():
    # 随机颜色散点图
    fig = plt.figure()
    ax = fig.add_subplot(projection='3d')

    # c: 颜色 可为单个,可为序列
    # ‘b’ blue 蓝色、g’ green 绿色、‘r’ red 红色、‘c’ cyan 兰青色
    # ‘m’ magenta 紫色、‘y’ yellow 黄色、‘k’ black 黑色、‘w’white 白色
    colors = ['b', 'g', 'r', 'c', 'm', 'y', 'k', 'w']
    c = np.repeat(colors, 15)[:100]
    ax.scatter(xs=x, ys=y, zs=0, zdir='z', s=30, c=c, depthshade=True, cmap="jet", marker="^")
    plt.show()

    # demo示例
    # 设置种子以便重现随机值
    np.random.seed(19680801)
    fig = plt.figure()
    ax = fig.add_subplot(projection='3d')
    n = 100
    # 每一个样式,绘制n个随机点
    # 定义 x in [23, 32], y in [0, 100], z in [zlow, zhigh].
    for m, zlow, zhigh in [('o', -50, -25), ('^', -30, -5)]:
        xs = randrange(n, 23, 32)
        ys = randrange(n, 0, 100)
        zs = randrange(n, zlow, zhigh)
        ax.scatter(xs, ys, zs, marker=m)
    ax.set_xlabel('X Label')
    ax.set_ylabel('Y Label')
    ax.set_zlabel('Z Label')
    plt.show()


# 线框图
def wireframe_3d():
    fig = plt.figure()
    ax = fig.add_subplot(projection='3d')

    x = np.random.randint(-30, high=30, size=(50,)).reshape((25, 2))
    y = np.random.randint(-30, high=30, size=(50,)).reshape((25, 2))
    z = np.zeros(50).reshape((25, 2))

    # c: 颜色
    # ‘b’ blue 蓝色、g’ green 绿色、‘r’ red 红色、‘c’ cyan 兰青色
    # ‘m’ magenta 紫色、‘y’ yellow 黄色、‘k’ black 黑色、‘w’white 白色
    ax.plot_wireframe(x, y, z, color='m')
    plt.show()

    # demo示例
    fig = plt.figure()
    ax = fig.add_subplot(projection='3d')
    # 获取测试数据
    X, Y, Z = axes3d.get_test_data(0.05)
    # 绘制基本的线框图
    ax.plot_wireframe(X, Y, Z, color='c', rstride=10, cstride=10)
    plt.show()


# 曲面图,默认情况下,它将以纯色的阴影着色,但它也通过提供 cmap 参数支持颜色映射。
# rcount 和 ccount kwargs 都默认为 50,决定了每个方向使用的最大样本数。如果输入数据较大,则会将其下采样(通过切片)到这些点数。
# 为了最大限度地提高渲染速度,将 rstride 和 cstride 分别设置为行数减 1 和列数减 1 的除数。例如,给定 51 行,rstride 可以是 50 的任何除数。
# 同样,设置 rstride 和 cstride 等于 1(或 rcount 和 ccount 等于行数和列数)可以使用优化路径。
def surface_3d():
    # 3D 表面(颜色图)演示绘制使用冷暖色图着色的 3D 表面。通过使用 antialiased=False 使表面变得不透明。
    import matplotlib.pyplot as plt
    from matplotlib import cm
    from matplotlib.ticker import LinearLocator
    import numpy as np

    fig, ax = plt.subplots(subplot_kw={"projection": "3d"})

    # 构建数据
    X = np.arange(-5, 5, 0.25)
    Y = np.arange(-5, 5, 0.25)
    X, Y = np.meshgrid(X, Y)
    R = np.sqrt(X ** 2 + Y ** 2)
    Z = np.sin(R)

    # 绘制曲面图
    # 绘制使用冷暖色图着色的 3D 表面。通过使用 antialiased=False 使表面变得不透明。
    surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm,
                           linewidth=0, antialiased=False)

    # 定制z轴
    ax.set_zlim(-1.01, 1.01)
    ax.zaxis.set_major_locator(LinearLocator(10))
    # A StrMethodFormatter is used automatically
    ax.zaxis.set_major_formatter('{x:.02f}')

    # 添加一个颜色条形图展示颜色区间
    fig.colorbar(surf, shrink=0.5, aspect=5)
    plt.show()

    # 绘制曲面图
    # 绘制使用冷暖色图着色的 3D 表面。通过使用 antialiased=True 使表面变得透明。
    fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
    surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm,
                           linewidth=0, antialiased=True)
    # 定制z轴
    ax.set_zlim(-1.01, 1.01)
    ax.zaxis.set_major_locator(LinearLocator(10))
    # A StrMethodFormatter is used automatically
    ax.zaxis.set_major_formatter('{x:.02f}')
    # 添加一个颜色条形图展示颜色区间
    fig.colorbar(surf, shrink=0.5, aspect=5)
    plt.show()


# 三角曲面图
def tri_surface_3d():
    n_radii = 8
    n_angles = 36

    # 将半径和角度设为等差数组(省略半径r=0以消除重复)
    # start,stop,n,endpoint 默认endpoint为True,包含stop,为False不包含stop
    radii = np.linspace(0.125, 1.0, n_radii)
    angles = np.linspace(0, 2 * np.pi, n_angles, endpoint=False)[..., np.newaxis]

    # 将polar极坐标(半径、角度)转换为cartesian笛卡尔坐标(x、y)
    # (0,0)在此阶段手动添加,因此(x,y)平面中的点不会重复
    x = np.append(0, (radii * np.cos(angles)).flatten())
    y = np.append(0, (radii * np.sin(angles)).flatten())

    # 计算z以生成pringle surface普林格尔曲面
    z = np.sin(-x * y)

    ax = plt.figure().add_subplot(projection='3d')
    ax.plot_trisurf(x, y, z, linewidth=0.2, antialiased=True)
    plt.show()


# 3D线图
line_3d()

# 3D散点图
scatter_3d()

# 3D随机颜色散点图
scatter_random_color_3d()

# 线框图
wireframe_3d()

# 曲面图,默认情况下,它将以纯色的阴影着色,但它也通过提供 cmap 参数支持颜色映射。
surface_3d()

# 三角曲面图
tri_surface_3d()

参考

  • https://matplotlib.org/stable/tutorials/toolkits/mplot3d.html#toolkit-mplot3d-tutorial
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Matplotlib三维绘图,这一篇就够了 的相关文章

  • 在matplotlib中绘制曲线连接点

    所以我试图绘制曲线来连接点 这是我正在使用的代码 def hanging line point1 point2 a point2 1 point1 1 np cosh point2 0 np cosh point1 0 b point1 1
  • 如何更改matplotlib中填充线的线宽?

    有没有办法增加 matplotlib 中剖面线的宽度 例如 下面的代码通过指定linewidth仅改变边缘的宽度 我想更改用于填充的线的线宽 import matplotlib pyplot as plt import numpy as n
  • 如何更改动画中的线条格式? [复制]

    这个问题在这里已经有答案了 我使用 matplotlib 制作了这个动画 它工作正常 但是 我需要添加一些动画标签以与其相应的点一起移动 第一个标签指的是圆与椭圆中心的水平线之间的交点 另一个文本标签位于斜线的中间 注释其长度 我尝试了一些
  • 如何设置matplotlib中轴的单位长度?

    例如x 1 180 000 当我绘制它时 在 x 轴上显示 1 20 000 40 000 180 000 这些0真的很烦人 如何将x轴的单位长度更改为1000 以便显示 1 20 40 180 并且还表明某处其单位为 1000 我知道我自
  • Pandas ImportError:绘图需要 matplotlib

    Pandas 无法识别已安装的 matplotlib 库 这是代码 import pandas as pd import numpy as np import matplotlib pyplot as plt matplotlib inli
  • 在同一个图表上绘制两个直方图,并将它们的列总和为 100

    我有两组不同大小的数据 我想将它们绘制在同一个直方图上 然而 由于一组有约 330 000 个值 另一组有约 16 000 个值 因此它们的频率直方图很难比较 我想绘制一个比较两组的直方图 使得 y 轴是该箱中出现的百分比 我下面的代码与此
  • Matplotlib 动画未显示

    当我在家里的电脑上尝试这个时 它可以工作 但在工作的电脑上却不行 这是代码 import numpy as np import matplotlib pyplot as plt import matplotlib animation as
  • 在 Seaborn 中的 distplot 或 kdeplot 的平均峰值处绘制一个点

    我感兴趣的是自动绘制分布平均峰值上方的点 由 kdeplot 或带有 kde 的 distplot 表示 手动绘制点和线很简单 但我很难推导出这个最大坐标点 例如 下面生成的 kdeplot 应该在大约 3 5 1 0 处绘制一个点 iri
  • Julia:如何使用 PyPlot 创建不同大小的子图?

    我想创建一个包含多个绘图的图形 不过我希望能够使每个图具有不同的大小 例如 我希望第一个子图的宽度大约是第二个子图的两倍 我希望做这样的事情 using PyPlot a rand 500 900 b rand 500 400 notice
  • 箱线图与箱线图有何不同?

    我想知道当我们在海生图书馆中有箱线图时为什么会有箱线图 我知道一件事是箱线图优化了表示数据的方式 特别是对于大型数据集 但我不知道为什么 除此之外 我没有任何充分的理由使用箱线图 箱线图将中位数显示为中心线 第 50 个百分位数 然后将第
  • 设置使用 pandas 绘图方法创建的图表上的 x 轴格式

    pandas DataFrame plot 是一种从数据帧绘制数据的便捷方法 但是 我不明白如何使用此方法格式化轴 例如 import pandas as pd import datetime df pd DataFrame index d
  • 绘制连接两点的曲线而不是直线

    I want to do something like this 我有要点 但不知道如何绘制曲线而不是直线 谢谢 对于对这个问题感兴趣的人 我遵循了 Matthew 的建议并提出了这个实现 def hanging line point1 p
  • PyCharm matplotlib 交互式图形而不阻塞执行

    我阅读了很多有关该主题的堆栈溢出问题 但经过大量实验后我无法弄清楚我的问题 我在 Windows 7 上使用 PyCharm 2016 3 2 但在 OSX 上也有同样的问题 我的解释器是带有 Python 3 6 和 matplotlib
  • 对seaborn图中的分类x轴进行排序

    我正在尝试使用 seaborn 散点图绘制数据框中前 30 的值 如下所示 同一图的可重现代码 import seaborn as sns df sns load dataset iris function to return top 30
  • 是否可以使用seaborn 进行“缩放插图”?

    这个例子 https matplotlib org examples pylab examples axes demo html来自 matplotlib 的展示了如何进行插图 不过我正在使用seaborn 特别是kdeplot sns k
  • matplotlib 轴标签偏移量的因素和变化

    在 matplotlib 中的轴刻度标签上 有两种可能的偏移量 factors and shifts 在右下角 1e 8 是一个 因子 1 441249698e1 是一个 移位 这里有很多答案展示了如何操纵两个都 matplotlib 将轴
  • Python:如何在烧瓶中显示 matplotlib [重复]

    这个问题在这里已经有答案了 我对 Flask 和 Matplotlib 很陌生 我希望能够显示我在某些 html 中生成的简单图表 但我很难弄清楚如何实现 这是我的Python代码 from flask import Flask rende
  • Matplotlib 未在前两个子图中显示 xlabel

    我编写了一个函数来在此处显示一些图表 def plot price series df ts1 ts2 price series line graph fig plt figure ax1 fig add subplot 221 ax1 p
  • 使用每日频率格式化 x 轴

    我正在尝试获取每日数据图 我有 3 个月的数据 每天都很难指出 如何格式化 x 轴 以便我可以获得每个日期 可以使用以下命令更改主要刻度的频率set major locator mdates DayLocator interval 5 如下
  • 在 Plotly Density_Mapbox 上添加 GeoJSON 等高线作为图层

    我想在上面添加天气轮廓plotly density mapbox地图 但我不确定必要的步骤 首先 我创建了一个matplotlib等值线图以可视化数据 然后 我用了geojsoncontour创建一个geojson文件来自所说matplot

随机推荐

  • 串行通信基础知识与UART驱动构件使用方法

    串行通信基础 串行通信接口 异步串行通信 UART 常称为 串口 或SCI xff0c 在USB未普及之前 xff0c 是PC机必备通信接口之一 通信方式为单字节通信 xff0c 是最简单的串行通信方式 RS232 RS485 接线简单 x
  • ARM Cortex-M0+中断机制与中断编程步骤

    中断基础知识 为什么需要使用中断 xff1f 如果通过查询接收标志查看一个字节是否收到 xff0c 则需要时刻花费CPU等资源 但中断机制能够在收到一个字节后 xff0c 通知CPU把收到的字节取走 异常 xff1a CPU强行从正常运行的
  • 计算机网络体系结构

    一 计算机网络概述 计算机网络的概念 组成与功能 概念 功能 组成 工作方式 分类 计算机网络的标准化工作及相关组织 标准分类 计算机网络的标准化工作 相关组织 二 计算机网络体系结构与参考模型 计算机网络分层结构 计算机网络体系结构 为什
  • KL25嵌入式实验考核

    KL25嵌入式实验考核 xff08 6 43 xff09 404 页面找不到 说明资源在审核中 1 利用 KL25 小板实现 控制红色 LED 灯每隔 2 秒钟亮暗变换的同时 在 PC 机上显示 MCU 的计时时间 xff0c MCU 的初
  • 自制PMW3901光流模块

    PMW3901光流Sensor体积小 功耗低 精度高 xff0c 效果非常好 xff0c 自己做了一个光流小模块带TOF测距 xff0c 使用Pixracer 43 PX4固件 xff0c 测试效果还不错 测试视频 xff1a https
  • 模数转换ADC模块

    通用基础知识 ADC模块是嵌入式应用中重要的组成部分 xff0c 是嵌入式系统与外界连接的纽带 xff0c 是在测控系统中的重要内容 ADC模块 xff1a 即模数转换模块 AD转换模块 xff0c 功能是将电压信号转换为相应的数字信号 实
  • 实验五 Flash在线编程实验

    一 xff0e 实验目的 xff08 1 xff09 掌握 Flash 存储器在线编程的基本概念 xff08 2 xff09 熟悉 Flash 存储器的在线编程擦除和写入的步骤 xff08 3 xff09 进一步深入理解 MCU 和 C 串
  • Install OpenCV+ Python in Ubuntu

    1 VMware安装ubuntu 不建议在Windows下学习 安装教程 Tip1 xff1a Ubuntu安装结束后无法正常联网 然后就是等待漫长的更新 Tip2 文件含有中文名 打开终端 export LANG 61 en US xdg
  • Tracking motion in video

    Tracking motion in video Download the source code to Ball Tracking with OpenCV
  • parse command line arguments

    parse command line arguments
  • 计算机网络

    计算机网络 一 计算机网络体系结构 二 物理层 三 数据链路层 四 网络层 五 运输层 六 应用层
  • 【c++初学】遇到问题:对xxx未定义的引用

    在编译的时候遇到了 未定义引用 root 64 czp span class token operator span PC span class token operator span span class token operator s
  • 在同一个浏览器上打开同一个网址只打开一个窗口的方法

    具体问题看图吧 xff0c 我自己也说不清楚 具体操作如下 xff1a target属性的功能之一是可以在同一个浏览器中只打开被标记相同的网页窗口 利用这一功能可以实现以上问题 target属性链接地址 xff1a http www w3s
  • esp32 Arduino IDE读取航模接收机SBUS信号

    库函数下载链接https download csdn net download qq 40925542 87207281 该库函数适用于具有多个串口的开发板 xff0c esp32中测试通过 xff0c 测试代码如下 xff1a inclu
  • curl 401 unauthorized解决

    用curl获取web信息时遇到了401unauthorized错误 用下面的命令解决了 xff1a span class token function curl span insecure anyauth u admin password
  • git自建服务器-借助蒲公英实现远程访问

    git自建服务器 借助蒲公英实现远程访问 本文涉及蒲公英组网 xff0c 这里大家可以参考蒲公英官网组网教程 使用的硬件 蒲公英x3a 路由器 xff1a 用于智能组网 xff0c 实现内网穿透vpn功能 xff1b orange pi3
  • sockaddr与sockaddr_in结构体简介

    span class token keyword struct span sockaddr span class token punctuation span span class token keyword unsigned span s
  • ROS入门(二)——创建功能包和工作空间

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言一 工作空间 xff08 workspace xff09 xff1f 二 创建工作空间 xff08 workspace xf
  • SpringBoot异常处理-SimpleMappingExceptionResolver(四)

    异常处理 SimpleMappingExceptionResolver 配置 SimpleMappingExceptionResolver 处理异常 在全局异常类中添加一个方法完成异常的同一处理 结果是只不返回参数 没有上一个博客方法好 但
  • Matplotlib三维绘图,这一篇就够了

    Matplotlib三维绘图 xff0c 这一篇就够了 1 效果图1 1 3D线效果图1 2 3D散点效果图1 3 3D随机颜色散点效果图1 4 3D散点不同mark点效果图1 5 3D线框效果图1 6 3D曲面不透明效果图1 7 3D曲面