You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python新手求助:如何用Matplotlib subplot将两条粒子速率分布曲线绘于同一画布?

解决麦克斯韦分布多m值绘图问题

首先,你现有代码的核心问题是两次赋值m导致只保留了最后一个值,且未循环处理不同的m值。下面提供两种基于subplot的实现方案,满足不同展示需求:

方案1:同一子图对比两条曲线(单subplot)

如果希望在同一个子图里直接对比两条曲线,只需循环遍历不同m值分别绘制即可:

import numpy as np
import matplotlib.pyplot as plt

def particles_speed(v, T, m):
    kb = 1.38e-23
    return (m/(2*np.pi*kb*T))**1.5 * 4*np.pi*v**2 * np.exp(-m*v**2/(2*kb*T))

v = np.linspace(0, 2000, 3000)
amu = 1.66e-27
# 存储两个不同的m值,并添加清晰标识
m_values = [32*amu, 0.910e-30]
m_labels = ["O₂分子 (32amu)", "电子 (0.910e-30kg)"]
T = 1000  # 固定温度

fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(1, 1, 1)  # 1行1列的单个子图

for m, label in zip(m_values, m_labels):
    particles = particles_speed(v, T, m)
    ax.plot(v, particles, label=label, lw=1)

# 统一设置图属性(不要放在循环里,避免重复执行)
ax.legend(loc=0)
ax.set_xlabel('v (m/s)')
ax.set_ylabel('概率密度 f(v)')
ax.set_title(f'麦克斯韦速率分布 (T={T} K)')
ax.grid()

plt.show()

方案2:分离子图展示(多subplot)

如果想用独立子图分别展示每个m值的曲线,可以设置1行2列或2行1列的subplot布局:

import numpy as np
import matplotlib.pyplot as plt

def particles_speed(v, T, m):
    kb = 1.38e-23
    return (m/(2*np.pi*kb*T))**1.5 * 4*np.pi*v**2 * np.exp(-m*v**2/(2*kb*T))

v = np.linspace(0, 2000, 3000)
amu = 1.66e-27
m_values = [32*amu, 0.910e-30]
m_labels = ["O₂分子 (32amu)", "电子 (0.910e-30kg)"]
T = 1000

# 创建1行2列的子图布局
fig, axes = plt.subplots(1, 2, figsize=(12, 5))

# 遍历每个子图和对应的m值
for ax, m, label in zip(axes, m_values, m_labels):
    particles = particles_speed(v, T, m)
    ax.plot(v, particles, lw=1, color='blue')
    ax.set_xlabel('v (m/s)')
    ax.set_ylabel('概率密度 f(v)')
    ax.set_title(f'{label}\nT={T} K')
    ax.grid()

plt.tight_layout()  # 自动调整子图间距,避免重叠
plt.show()

关键修改说明

  • 将两个m值存入列表,用循环批量处理,减少重复代码
  • 把图属性设置(图例、坐标轴标签等)移出循环,避免重复执行
  • 添加清晰的粒子类型标签,方便区分不同曲线
  • 用plt.tight_layout()优化多子图的间距布局

内容的提问来源于stack exchange,提问作者Cesarengineer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 13:20:02