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
相关产品推荐
相关产品推荐

