Matplotlib 07-Python实验七-1 叠加显示正弦和余弦.py

 

import numpy as np
import matplotlib.pyplot as plt

# 创建X轴数据,从0到10,共100个点
x = np.linspace( 0, 10, 100 )
# Y轴,正弦
y1 = np.sin(x)
# Y轴,余弦
y2 = np.cos(x)

# 创建画布和第一个子图
fig, ax1 = plt.subplots( )
# 第一个子图,Y轴用蓝色,在左边
ax1.set_xlabel('X data')
# 第一个子图,X轴用蓝色
color = 'tab:blue'
ax1.set_ylabel('Sine Wave', color=color)
# 绘制蓝色折线图
ax1.plot(x, y1, color=color)
# Y轴刻度
ax1.tick_params(axis='y', labelcolor=color)

# 第二个子图,共享X轴
ax2 = ax1.twinx()  # instantiate a second axes that shares the same x-axis
# Y轴用红色,在右边
color = 'tab:red'
ax2.set_ylabel('Cosine Wave', color=color)
# 绘制红色折线图
ax2.plot(x, y2, color=color)
# Y轴刻度
ax2.tick_params(axis='y', labelcolor=color)

# 使用紧凑布局,防止超出画布
fig.tight_layout()  # otherwise the right y-label is slightly clipped

# 弹出画图窗口
plt.show()

 

逐行详细代码解释

程序功能:双 Y 轴绘图(共享 X 轴,左右两个独立 Y 轴),左边画正弦曲线、右边画余弦曲线。 用到库:numpy生成数值,matplotlib.pyplot绘图。 适用:希冀编程题可改造(后面顺带给你改成 OJ 自动判卷版本思路)

import numpy as np
import matplotlib.pyplot as plt
  • import numpy as np:导入 numpy,用来生成 x 坐标数组、计算 sin/cos
  • import matplotlib.pyplot as plt:matplotlib 绘图核心模块,别名 plt
# 创建X轴数据,从0到10,共100个点
x = np.linspace( 0, 10, 100 )

np.linspace(start, stop, num)

  • 在区间 \([0,10]\) 均匀生成100 个数字,包含起点 0 和终点 10
  • 得到一维数组 x,作为曲线横坐标
# Y轴,正弦
y1 = np.sin(x)
# Y轴,余弦
y2 = np.cos(x)
  • np.sin(x):对数组 x逐元素计算正弦值(向量化运算,不用循环),作为正弦曲线纵坐标
  • np.cos(x):逐元素计算余弦值,余弦曲线纵坐标
# 创建画布和第一个子图
fig, ax1 = plt.subplots( )

plt.subplots()

  • 返回两个对象:
    • fig:画布(整个图片容器)
    • ax1:第一个坐标系(子图对象,左边 Y 轴)

面向对象绘图风格(推荐),区别于简单的plt.plot()

# 第一个子图,X轴标签
ax1.set_xlabel('X data')

设置 X 轴文字标签:X data

# 第一个Y轴颜色:蓝色
color = 'tab:blue'
ax1.set_ylabel('Sine Wave', color=color)
  • set_ylabel():设置左侧 Y 轴名称:Sine Wave
  • 轴文字颜色指定为蓝色 tab:blue(matplotlib 内置标准颜色)
# 绘制蓝色折线图
ax1.plot(x, y1, color=color)

在 ax1 坐标系绘制折线:x 为横坐标,y1(正弦)纵坐标,线条蓝色。

# Y轴刻度
ax1.tick_params(axis='y', labelcolor=color)

tick_params:设置刻度参数

  • axis='y':只作用在 Y 轴
  • labelcolor=color:Y 轴刻度数字颜色改为蓝色,和曲线保持一致
# 第二个子图,共享X轴
ax2 = ax1.twinx()  # instantiate a second axes that shares the same x-axis

✅ 核心函数 twinx()

新建坐标系 ax2,和 ax1 共用同一个 X 轴,但是独立新增一条右侧 Y 轴

  • ax1:左 Y 轴(正弦)
  • ax2:右 Y 轴(余弦) 两条曲线可以拥有完全独立的 Y 坐标范围,适合两组量级不一样的数据画在一张图。
# Y轴用红色,在右边
color = 'tab:red'
ax2.set_ylabel('Cosine Wave', color=color)

设置右侧 Y 轴名称Cosine Wave,文字红色。

# 绘制红色折线图
ax2.plot(x, y2, color=color)

ax2 坐标系绘制余弦曲线,红色线条。

# Y轴刻度
ax2.tick_params(axis='y', labelcolor=color)

右侧 Y 轴刻度数字颜色设为红色。

# 使用紧凑布局,防止超出画布
fig.tight_layout()  # otherwise the right y-label is slightly clipped

tight_layout():自动调整画布内边距。 不加这句,右侧 Y 轴标签文字经常被裁剪,显示不全。

# 弹出画图窗口
plt.show()

把画布渲染,弹出图形窗口展示图片。


整体运行效果总结

  1. X 轴范围:0~10
  2. 左侧蓝色 Y 轴:正弦曲线 \(y=\sin(x)\)
  3. 右侧红色 Y 轴:余弦曲线 \(y=\cos(x)\)
  4. X 轴共用,左右两套独立 Y 轴,线条、轴文字颜色一一对应。

关键知识点

  1. twinx():共享 X 轴、双 Y 轴;对应还有twiny():共享 Y 轴,双 X 轴
  2. 面向对象绘图(fig/ax),比 plt.xxx 更适合多轴、复杂图
  3. tick_params 用来修改刻度样式、颜色、大小
  4. linspace:均分取点,包含终点;arange 是设置步长,不含终点

 

posted @ 2026-10-21 11:42  emanlee  阅读(4)  评论(0)    收藏  举报