Python绘制三维填充折线图的示例代码
目录
- 一、准备工作:安装必要的库
- 二、代码解析:一步步搭建三维填充折线图
- 1. 导入必要的模块
- 2. 设置中文和负号显示
- 3. 模拟数据
- 4. 创建图形
- 5. 设置颜色和样本标签
- 6. 构建多边形区域
- 7. 设置坐标轴和标题
- 8. 美化网格线和调整边距
- 9. 显示图形
- 三、运行代码并查看结果
- 四、总结
在数据可视化领域,三维图形能够以更直观的方式展示数据之间的复杂关系。今天,我们将从头开始,一步步学习如何使用python中的matplotlib
库绘制一个漂亮的三维填充折线图。即使你之前没有接触过Python绘图,也不用担心,我们将详细解释每一步。
一、准备工作:安装必要的库
在开始之前,我们需要确保安装了numpy
和matplotlib
这两个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. 设置中文和负号显示
matplot编程lib.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_positions
和peak_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, facecolorhttp://www.devze.coms=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
设置了填充颜色,edgecolors
和linewidths
设置了边框颜色和宽度,alpha
设置了透明度。add_collection3d
将多边形区域添加到三维图形中,zs
和zdir
参数用于指定每个样本在三维空间中的位置。
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
参数用于调整标签的位置,fontsize
和fontweight
分别设置字体大小和粗细。
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
添加了网格线,linestyle
、linewidth
和alpha
分别设置了网格线的样式、宽度和透明度。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 jsin 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绘制折线图内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
精彩评论