如何用Python绘制双质量-弹簧系统的可视化图形?
用Python绘制双质量-弹簧系统可视化图形
可以用matplotlib库实现这个需求,以下是完整可运行的代码,能生成美观的矢量图形:
import matplotlib.pyplot as plt from matplotlib.patches import Rectangle # 设置图形参数 fig, ax = plt.subplots(figsize=(8, 2), dpi=100) ax.set_xlim(-1, 11) ax.set_ylim(-1, 3) # 隐藏多余元素 ax.set_xticks([]) ax.set_yticks([]) for spine in ax.spines.values(): spine.set_visible(False) # 绘制左右墙体 wall_width = 0.3 wall_height = 3 ax.add_patch(Rectangle((-wall_width, 0), wall_width, wall_height, color='#333333')) ax.add_patch(Rectangle((10, 0), wall_width, wall_height, color='#333333')) # 质量块参数 mass_width = 1 mass_height = 2 m1_x = 2 m2_x = 7 # 绘制质量块 ax.add_patch(Rectangle((m1_x - mass_width/2, 0.5), mass_width, mass_height, color='#4CAF50')) ax.add_patch(Rectangle((m2_x - mass_width/2, 0.5), mass_width, mass_height, color='#2196F3')) # 添加质量块标注 ax.text(m1_x, 1.5, 'M1', fontsize=14, ha='center', va='center', color='white') ax.text(m2_x, 1.5, 'M2', fontsize=14, ha='center', va='center', color='white') # 绘制弹簧(用折线模拟波浪) def draw_spring(start_x, end_x, y=1.5, num_waves=10, wave_amplitude=0.3): x = [] y_points = [] segment_length = (end_x - start_x) / (num_waves * 2) current_x = start_x for i in range(num_waves * 2 + 1): x.append(current_x) if i % 2 == 0: y_points.append(y + wave_amplitude) else: y_points.append(y - wave_amplitude) current_x += segment_length # 修正最后一个点的y值为中间值,避免弹簧两端翘起 y_points[-1] = y y_points[0] = y ax.plot(x, y_points, color='#FF9800', linewidth=2) # 绘制三个弹簧 draw_spring(wall_width, m1_x - mass_width/2) draw_spring(m1_x + mass_width/2, m2_x - mass_width/2) draw_spring(m2_x + mass_width/2, 10) plt.tight_layout() plt.show()
关键部分说明
- 墙体与质量块:用
Rectangle绘制矩形元素,通过调整坐标和尺寸控制位置大小,颜色区分不同组件 - 弹簧模拟:自定义
draw_spring函数生成波浪形折线,通过num_waves和wave_amplitude控制弹簧的疏密和幅度 - 美化处理:隐藏坐标轴刻度和边框,调整布局让图形更简洁,标注文字居中显示
如果需要调整样式,比如修改颜色、质量块大小、弹簧长度,直接修改代码中对应的参数即可。
内容的提问来源于stack exchange,提问作者stancallewier
相关产品推荐
相关产品推荐

