Python绘制三维填充折线图的示例代码

 更新时间:2025年07月09日 10:09:22   作者:Code_Verse  
在数据可视化领域,三维图形能够以更直观的方式展示数据之间的复杂关系,本文将为大家详细介绍如何使用Python绘制三维填充折线图,需要的小伙伴可以了解下

在数据可视化领域,三维图形能够以更直观的方式展示数据之间的复杂关系。今天,我们将从头开始,一步步学习如何使用Python中的matplotlib库绘制一个漂亮的三维填充折线图。即使你之前没有接触过Python绘图,也不用担心,我们将详细解释每一步。

一、准备工作:安装必要的库

在开始之前,我们需要确保安装了numpymatplotlib这两个Python库。如果你还没有安装它们,可以通过以下命令安装:

pip install numpy matplotlib

这两个库是Python数据科学领域中非常基础且强大的工具,numpy用于高效处理数值数据,而matplotlib则用于数据可视化。

二、代码解析:一步步搭建三维填充折线图

1. 导入必要的模块

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.art3d import PolyCollection
import matplotlib.cm as cm
import matplotlib
  • numpy(通常简写为np)用于生成和处理数据。
  • matplotlib.pyplot(简写为plt)是matplotlib中用于绘图的主要模块。
  • PolyCollection是用于创建三维填充区域的工具。
  • matplotlib.cm提供了丰富的颜色映射,用于给图形上色。
  • matplotlib用于设置全局绘图参数,比如字体和符号显示。

2. 设置中文和负号显示

matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False

这两行代码是为了确保在图表中可以正常显示中文字符和负号。如果你的系统中没有SimHei字体,可以替换为其他支持中文的字体。

3. 模拟数据

num_samples = 5
mz = np.linspace(0, 100, 300)
spectra = []
np.random.seed(0)
for i in range(num_samples):
    peak_positions = np.random.uniform(20, 80, 3)
    peak_heights = np.random.uniform(0.8, 1.5, 3)
    spectrum = sum(h * np.exp(-0.5 * ((mz - p)/3)**2) for p, h in zip(peak_positions, peak_heights))
    spectrum += np.random.normal(0, 0.05, len(mz))
    spectra.append(spectrum)

这里我们生成了一些模拟数据,用来展示图表的效果。num_samples表示我们有5个样本,mz是一个从0到100的线性分布的数组,表示质荷比(M/Z)。spectra是一个列表,存储每个样本的光谱数据。

  • np.random.seed(0)是为了确保每次生成的数据都是一样的,方便我们复现结果。
  • peak_positionspeak_heights分别表示峰的位置和高度,它们是随机生成的。
  • spectrum是通过高斯函数生成的光谱数据,最后加上了一些随机噪声。

4. 创建图形

fig = plt.figure(figsize=(12, 7), facecolor='white')
ax = fig.add_subplot(111, projection='3d')
  • plt.figure创建了一个新的图形窗口,figsize参数设置了图形的大小,facecolor设置了背景颜色。
  • add_subplot添加了一个子图,projection='3d'表示这是一个三维图形。

5. 设置颜色和样本标签

colors = cm.viridis(np.linspace(0.2, 0.8, num_samples))
sample_labels = ['样本A', '样本B', '样本C', '样本D', '样本E']
  • cm.viridis是一个颜色映射,它会根据输入的值生成一系列颜色。这里我们生成了5种颜色,用于区分不同的样本。
  • sample_labels是一个列表,存储每个样本的标签。

6. 构建多边形区域

verts = []
for spectrum in spectra:
    verts.append(list(zip(mz, spectrum)))
poly = PolyCollection(
    verts,
    facecolors=colors,
    edgecolors='k',         # 添加黑色边框
    linewidths=0.6,         # 细边框
    alpha=0.85              # 稍微增强填充透明度
)
ax.add_collection3d(poly, zs=range(num_samples), zdir='y')
  • verts是一个列表,存储每个样本的多边形顶点。zip(mz, spectrum)将质荷比和对应的光谱强度组合起来。
  • PolyCollection用于创建填充的多边形区域,facecolors设置了填充颜色,edgecolorslinewidths设置了边框颜色和宽度,alpha设置了透明度。
  • add_collection3d将多边形区域添加到三维图形中,zszdir参数用于指定每个样本在三维空间中的位置。

7. 设置坐标轴和标题

ax.set_xlabel('质荷比 (M/Z)', labelpad=12, fontsize=12, fontweight='bold')
ax.set_xlim(0, 100)
ax.set_ylabel('样本', labelpad=12, fontsize=12, fontweight='bold')
ax.set_ylim(-0.5, num_samples - 0.5)
ax.set_yticks(range(num_samples))
ax.set_yticklabels(sample_labels, fontsize=11)
ax.set_zlabel('离子强度', labelpad=10, fontsize=12, fontweight='bold')
ax.set_zlim(0, 1.6)
ax.set_title('提取的质谱子集', fontsize=14, fontweight='bold', pad=20)

这里我们设置了坐标轴的标签、范围、刻度标签和标题。labelpad参数用于调整标签的位置,fontsizefontweight分别设置字体大小和粗细。

8. 美化网格线和调整边距

ax.tick_params(axis='both', which='major', labelsize=10)
ax.grid(True, linestyle='--', linewidth=0.5, alpha=0.4)
fig.subplots_adjust(left=0.08, right=0.95, top=0.92, bottom=0.08)
  • tick_params设置了坐标轴刻度的字体大小。
  • grid添加了网格线,linestylelinewidthalpha分别设置了网格线的样式、宽度和透明度。
  • subplots_adjust调整了图形的边距,确保内容不会被遮挡。

9. 显示图形

plt.show()

最后,调用plt.show()就可以显示我们绘制的三维填充折线图了。

三、运行代码并查看结果

当你运行上述代码时,你会看到一个三维填充折线图。每个折线代表一个样本的光谱数据,填充区域的颜色表示不同的样本,如下图所示。

完整代码如下:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.art3d import PolyCollection
import matplotlib.cm as cm
import matplotlib
# 设置中文和负号显示
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False
# 模拟数据
num_samples = 5
mz = np.linspace(0, 100, 300)
spectra = []
np.random.seed(0)
for i in range(num_samples):
    peak_positions = np.random.uniform(20, 80, 3)
    peak_heights = np.random.uniform(0.8, 1.5, 3)
    spectrum = sum(h * np.exp(-0.5 * ((mz - p)/3)**2) for p, h in zip(peak_positions, peak_heights))
    spectrum += np.random.normal(0, 0.05, len(mz))
    spectra.append(spectrum)
# 创建图形
fig = plt.figure(figsize=(12, 7), facecolor='white')
ax = fig.add_subplot(111, projection='3d')
# 使用viridis色图
colors = cm.viridis(np.linspace(0.2, 0.8, num_samples))
sample_labels = ['样本A', '样本B', '样本C', '样本D', '样本E']
# 构建多边形区域
verts = []
for spectrum in spectra:
    verts.append(list(zip(mz, spectrum)))
poly = PolyCollection(
    verts,
    facecolors=colors,
    edgecolors='k',         
    linewidths=0.6,         
    alpha=0.85              
)
ax.add_collection3d(poly, zs=range(num_samples), zdir='y')
# 设置坐标轴
ax.set_xlabel('质荷比 (M/Z)', labelpad=12, fontsize=12, fontweight='bold')
ax.set_xlim(0, 100)
ax.set_ylabel('样本', labelpad=12, fontsize=12, fontweight='bold')
ax.set_ylim(-0.5, num_samples - 0.5)
ax.set_yticks(range(num_samples))
ax.set_yticklabels(sample_labels, fontsize=11)
ax.set_zlabel('离子强度', labelpad=10, fontsize=12, fontweight='bold')
ax.set_zlim(0, 1.6)
# 标题
ax.set_title('提取的质谱子集', fontsize=14, fontweight='bold', pad=20)
# 网格线美化
ax.tick_params(axis='both', which='major', labelsize=10)
ax.grid(True, linestyle='--', linewidth=0.5, alpha=0.4)
# 调整边距
fig.subplots_adjust(left=0.08, right=0.95, top=0.92, bottom=0.08)
# 显示图
plt.show()

四、总结

通过以上步骤,我们用Python和matplotlib库成功绘制了一个三维填充折线图。虽然代码看起来有点长,但其实每一步都很简单。你可以根据自己的需求修改数据、颜色和样式,制作出属于自己的图表。

到此这篇关于Python绘制三维填充折线图的示例代码的文章就介绍到这了,更多相关Python绘制折线图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python用Tkinter做自己的中文代码编辑器

    python用Tkinter做自己的中文代码编辑器

    这篇文章主要介绍了python用Tkinter做自己的中文代码编辑器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Python创建二维数组实例(关于list的一个小坑)

    Python创建二维数组实例(关于list的一个小坑)

    下面小编就为大家带来一篇Python创建二维数组实例(关于list的一个小坑)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • Django上使用数据可视化利器Bokeh解析

    Django上使用数据可视化利器Bokeh解析

    这篇文章主要介绍了Django上使用数据可视化利器Bokeh解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • 遗传算法之Python实现代码

    遗传算法之Python实现代码

    本篇文章主要介绍了Python 遗传算法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • 浅析python内置模块collections

    浅析python内置模块collections

    collections是Python内建的一个集合模块,提供了许多有用的集合类。这篇文章主要介绍了python内置模块collections的相关知识,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-11-11
  • 检测pytorch是否使用GPU的方法小结

    检测pytorch是否使用GPU的方法小结

    pytorch在服务器上跑的很慢,nvidia-smi显示GPU利用率一直是0%,所以本文总结了一些可以检测深度学习算法是否在使用GPU的方法,需要的朋友可以参考下
    2023-12-12
  • 正则表达式在Python中的应用小结

    正则表达式在Python中的应用小结

    正则表达式是一种强大的文本模式匹配工具,它可以帮助我们快速地检索、替换或提取字符串中的特定模式,在本文中,我将通过一些示例代码,详细介绍正则表达式在Python中的应用,感兴趣的朋友一起看看吧
    2024-07-07
  • Python pickle模块进行序列化的实现示例

    Python pickle模块进行序列化的实现示例

    pickle模块是一个用于实现数据序列化与反序列化的强大工具,本文就来介绍一下Python pickle模块进行序列化的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2025-01-01
  • python MultipartEncoder传输zip文件实例

    python MultipartEncoder传输zip文件实例

    这篇文章主要介绍了python MultipartEncoder传输zip文件实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • Python中DrissionPage的示例代码

    Python中DrissionPage的示例代码

    DrissionPage是一款集成了Selenium和Requests功能的Python库,本文就来介绍一下DrissionPage的具体使用,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2024-12-12

最新评论