使用Matplotlib绘制4垂直子图:多样本Flow Rate等参数曲线需求
解决方案
1. 正确的数据集字典结构
先构建层级清晰的字典,方便后续数据处理与绘图。顶层键为参数名称(Flow Rate、Temperature等),每个参数下包含三个样本的日期序列和对应参数值:
import pandas as pd import matplotlib.pyplot as plt # 示例数据集字典 dataset = { "Flow Rate": { "Sample A": { "dates": ["2024-01-03", "2024-01-01", "2024-01-02"], "values": [5.2, 4.8, 5.0] }, "Sample B": { "dates": ["2024-01-03", "2024-01-01", "2024-01-02"], "values": [6.1, 5.9, 6.0] }, "Sample C": { "dates": ["2024-01-03", "2024-01-01", "2024-01-02"], "values": [4.5, 4.3, 4.4] } }, "Temperature": { "Sample A": { "dates": ["2024-01-03", "2024-01-01", "2024-01-02"], "values": [25.3, 24.8, 25.0] }, "Sample B": { "dates": ["2024-01-03", "2024-01-01", "2024-01-02"], "values": [26.1, 25.9, 26.0] }, "Sample C": { "dates": ["2024-01-03", "2024-01-01", "2024-01-02"], "values": [24.5, 24.3, 24.4] } }, "Pressure": { "Sample A": { "dates": ["2024-01-03", "2024-01-01", "2024-01-02"], "values": [1.2, 1.1, 1.15] }, "Sample B": { "dates": ["2024-01-03", "2024-01-01", "2024-01-02"], "values": [1.3, 1.25, 1.28] }, "Sample C": { "dates": ["2024-01-03", "2024-01-01", "2024-01-02"], "values": [1.05, 1.0, 1.03] } }, "Concentration": { "Sample A": { "dates": ["2024-01-03", "2024-01-01", "2024-01-02"], "values": [0.8, 0.75, 0.78] }, "Sample B": { "dates": ["2024-01-03", "2024-01-01", "2024-01-02"], "values": [0.9, 0.88, 0.89] }, "Sample C": { "dates": ["2024-01-03", "2024-01-01", "2024-01-02"], "values": [0.7, 0.68, 0.69] } } }
2. 数据预处理:日期排序
由于测试日期无序,需将日期转为datetime类型并按时间排序对应的值:
# 遍历所有参数与样本,完成日期排序 for param in dataset: for sample in dataset[param]: # 转换日期为datetime对象 dates = pd.to_datetime(dataset[param][sample]["dates"]) values = dataset[param][sample]["values"] # 按日期排序,同步对应的值 sorted_indices = dates.argsort() dataset[param][sample]["dates"] = dates[sorted_indices] dataset[param][sample]["values"] = [values[i] for i in sorted_indices]
3. 绘制4行1列子图
用matplotlib创建垂直排列的子图,每个子图对应一个参数,绘制三个样本的曲线:
# 创建4行1列的子图布局,共享x轴对齐日期 fig, axes = plt.subplots(nrows=4, ncols=1, figsize=(10, 16), sharex=True) params = list(dataset.keys()) colors = ["#1f77b4", "#ff7f0e", "#2ca02c"] # 三个样本的区分色 samples = ["Sample A", "Sample B", "Sample C"] # 遍历每个子图与参数,绘制曲线 for ax, param in zip(axes, params): for sample, color in zip(samples, colors): ax.plot(dataset[param][sample]["dates"], dataset[param][sample]["values"], label=sample, color=color, marker="o") ax.set_title(f"{param}", fontsize=12) ax.set_ylabel(param.split()[0], fontsize=10) ax.grid(True, alpha=0.3) ax.legend() # 设置底部子图的x轴标签 axes[-1].set_xlabel("Test Date", fontsize=10) plt.tight_layout() plt.show()
关键说明
- 字典采用参数-样本-日期/值的层级结构,便于统一遍历处理;
- 利用
pd.to_datetime和argsort()实现日期排序,确保曲线按时间顺序展示; - 开启
sharex=True让所有子图日期轴对齐,提升可读性; - 用不同颜色+标记点区分样本,增强曲线辨识度。
内容的提问来源于stack exchange,提问作者Normad68
相关产品推荐
相关产品推荐

