每日小语
只有当精神在一种相当绝对的支离破碎状态下重新找到自己,他才赢得它的真理。——黑格尔
gpt代码学习
import numpy as np
import matplotlib.pyplot as plt
# 生成 x 数据,取值范围为 [0, 360] 度
x = np.linspace(0, 360, 1000)
# 计算 sin(x) 和 cos(x) 的值
y_sin = np.sin(np.radians(x)) # 将角度转换为弧度
y_cos = np.cos(np.radians(x))
# 创建一个图,并分为两个子图
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True)
# 在第一个子图中画 sin(x) 的曲线
ax1.plot(x, y_sin, label='sin(x)')
ax1.set_ylabel('sin(x)')
ax1.legend()
ax1.grid(True)
# 在第二个子图中画 cos(x) 的曲线
ax2.plot(x, y_cos, label='cos(x)')
ax2.set_xlabel('x (degrees)')
ax2.set_ylabel('cos(x)')
ax2.legend()
ax2.grid(True)
# 设置图的标题
fig.suptitle('Sin(x) and Cos(x) Curves')
# 显示图形
plt.show()
1.
x = np.linspace(0, 360, 1000)
`np.linspace(start, stop, num)` 是 NumPy 库中的一个函数,用于生成一个等间隔的数组。具体来说,它生成一个包含 `num` 个元素的数组,这些元素均匀地分布在指定的起始值 `start` 和结束值 `stop` 之间。
在代码中,`x = np.linspace(0, 360, 1000)` 生成了一个包含 1000 个元素的数组 `x`,这些元素均匀地分布在 0 到 360 之间。这样做的目的是为了在绘制曲线时获取足够的数据点,以使曲线看起来更加平滑。
具体解释如下:
- `start` 参数是数组的起始值,这里是 0。
- `stop` 参数是数组的结束值,这里是 360。
- `num` 参数是生成的数组的元素个数,这里是 1000。
所以,`x` 数组包含了从 0 到 360 的 1000 个等间隔的数值,用于表示 x 轴上的坐标点。
2.
# 计算 sin(x) 和 cos(x) 的值
y_sin = np.sin(np.radians(x)) # 将角度转换为弧度
y_cos = np.cos(np.radians(x))
这一步是因为在 NumPy 中,`np.sin()` 和 `np.cos()` 函数中的角度参数默认是弧度而不是角度。因此,在计算正弦和余弦函数的值之前,我们需要先将角度转换为弧度。
通过使用 `np.radians()` 函数,我们可以将角度转换为弧度。所以 `y_sin = np.sin(np.radians(x))` 和 `y_cos = np.cos(np.radians(x))` 这两行代码将角度数组 `x` 转换为弧度,并分别计算了这些弧度对应的正弦和余弦值。
3.
# 创建一个图,并分为两个子图
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True)
这一行代码使用 Matplotlib 库的 `subplots` 函数创建了一个包含两个子图的图。具体来说,`subplots(2, 1, sharex=True)` 表示创建一个包含两行、一列的图,并且这两个子图共享相同的 x 轴。
`subplots(2, 1, sharex=True)` 中的参数表示创建一个包含两行一列的图,并且这两个子图共享相同的 x 轴。
具体来说:
- 第一个参数 `2` 表示创建两行。这意味着图中将有两个子图,一个位于上半部分,另一个位于下半部分。
- 第二个参数 `1` 表示创建一列。这意味着两个子图都在同一列中。
- `sharex=True` 表示这两个子图共享 x 轴。这意味着两个子图的 x 轴刻度和范围相同,使得它们在 x 轴方向上对齐。
这种设置常用于同时显示两个相关的图,例如两个函数的曲线,方便进行比较。在这个例子中,分别在上半部分和下半部分的子图中绘制了 `sin(x)` 和 `cos(x)` 的曲线。
希望这解释清楚了 `subplots` 参数的作用。如果还有其他问题,请随时提问。
- `fig` 是整个图的对象。
- `(ax1, ax2)` 是包含两个子图的轴对象的元组。
- `2` 表示两行,`1` 表示一列。
- `sharex=True` 表示这两个子图共享 x 轴。
这样设置的好处是,两个子图的 x 轴刻度是相同的,方便进行对比。
4.
# 在第一个子图中画 sin(x) 的曲线
ax1.plot(x, y_sin, label='sin(x)')
ax1.set_ylabel('sin(x)')
ax1.legend()
ax1.grid(True)
- `ax1.plot(x, y_sin, label='sin(x)')` 用于绘制 sin(x) 的曲线,其中 `x` 是角度数组,
角度数组是一个包含角度值的一维数组。角度用于度量角的大小,通常以度(°)为单位表示。在计算机科学中,角度通常使用弧度来进行计算和处理,但在可视化和绘图中,我们经常需要将角度作为输入。
在这个例子中,通过使用 `np.linspace(0, 360, 1000)` 创建了一个包含 1000 个等间隔的角度值的数组 `x`。这个数组表示了从 0 度到 360 度之间的角度的连续序列。通过使用这个角度数组 `x`,我们可以计算对应的正弦和余弦值来绘制出 sin(x) 和 cos(x) 的曲线。
需要注意的是,在进行数学计算和函数操作时,通常要求将角度值转换为弧度值。这是因为大多数数学函数(例如 `np.sin()` 和 `np.cos()`)默认使用弧度作为输入单位。在代码中使用了 `np.radians()` 函数将角度数组转换为弧度数组,以方便计算正弦和余弦函数的值。这样可以确保我们在计算函数值时使用正确的单位。
所以在这里,角度数组 `x` 是一个包含从 0 度到 360 度之间的等间隔角度值的一维数组,用于绘制曲线和进行函数计算。
`y_sin` 是相应的正弦值。`label='sin(x)'` 设置了曲线的标签,用于后续图例的显示。
- `ax1.set_ylabel('sin(x)')` 设置了 y 轴的标签为 'sin(x)'。
- `ax1.legend()` 添加图例,显示曲线的标签。
- `ax1.grid(True)` 添加网格,使图形更加清晰。
这样的设置使得第一个子图中包含了 sin(x) 的曲线,并有相应的标签和图例。后续的代码在第二个子图中完成了 cos(x) 的曲线的绘制和设置。
5.
# 在第二个子图中画 cos(x) 的曲线
ax2.plot(x, y_cos, label='cos(x)')
ax2.set_xlabel('x (degrees)')
ax2.set_ylabel('cos(x)')
ax2.legend()
ax2.grid(True)
这个其实就是复制上一步。
`ax2.set_xlabel('x (degrees)')` 这行代码是用于设置第二个子图 `ax2` 的 x 轴标签。具体来说,这行代码将 x 轴标签设置为字符串 'x (degrees)'。
因为上面没设置x的轴标签。
解释如下:
- `ax2` 表示第二个子图的轴对象。
- `set_xlabel('x (degrees)')` 是用于设置 x 轴标签的方法,其中 'x (degrees)' 是要显示的标签文本。
这样做的目的是为图形提供更清晰的标注,以便读者知道 x 轴代表的是角度,并且以度数为单位。这对于理解图形的含义非常有帮助。
6.
# 设置图的标题
fig.suptitle('Sin(x) and Cos(x) Curves')
# 显示图形
plt.show()
这个就比较简单啦
自己敲写代码
这是最后结果图
import numpy as np
import matplotlib.pyplot as plt
x=np.linspace(0,360,1000)
#度数化弧度,计算sin和cos的值
y_sin=np.sin(np.radians(x))
y_cos=np.cos(np.radians(x))
#建图,分为两个子图
fig,(ax1,ax2)=plt.subplots(2,1,sharex=True)
#第一个子图画sinx
ax1.plot(x,y_sin,label='sin(x)')
ax1.set_ylabel('sin(x)')
ax1.grid(True)
#cosx
ax2.plot(x,y_cos,label='cos(x)')
ax2.set_xlabel('x(degrees)')
ax2.set_ylabel('cos(x)')
ax2.grid(True)
#title
fig.suptitle('sin(x)和cos(x)')
plt.show()
会发现matplotlib好像读不了中文。敲写时还是不熟悉,需要照着源代码的步骤一步步来,很艰难。
其中有一个疑问,set_ylabel这个是内置函数嘛?
`set_ylabel` 是 Matplotlib 中的内置函数。它用于设置图形对象中 y 轴的标签。通过调用 `ax.set_ylabel(label)` 函数,可以将指定的标签文本应用于 y 轴。
在之前的示例代码中,我们使用了 `ax2.set_ylabel('sin(x)')` 和 `ax1.set_ylabel('cos(x)')` 这两行代码来设置第一个子图和第二个子图的 y 轴标签。这样做的目的是为图形提供更清晰的标注,以帮助读者理解数据的含义。`set_ylabel` 函数是 Matplotlib 中轴对象 `Axes` 的一个方法,可以用于对坐标轴进行各种设置,包括标签、刻度等。
这种题目感觉就是记忆方面,过程方面较艰难,但你让我自己现在再写,那我肯定还是很吃力的。
但真正的勇士,就是得直面惨淡的人生,正视淋漓的鲜血,来吧,开启我们的第三遍旅程!
自己再次敲写代码
还要记得调一下那个1000,看看会有什么神奇的结果。最后需要加强plot函数的记忆,set_ylabel,set_xlabel的使用。
import numpy as np
import matplotlib.pyplot as plt
#x是自变量,所以先设置它
x=np.linspace(0,360,1000)
#y是因变量,需要将度转为弧度,然后计算y的值
y_sin=np.sin(np.radians(x))
y_cos=np.cos(np.radians(x))
#创建两个子图
fig,(ax1,ax2)=plt.subplots(2,1,sharex=True)
#sinx
ax1.plot(x,y_sin,label='sin(x)')
ax1.set_ylabel('sin(x)')
ax1.grid(True)
#cosx
ax2.plot(x,y_cos,label='cos(x)')
ax2.set_ylabel('cos(x)')
ax2.set_xlabel('x(degree)')
ax2.grid(True)
#title
fig.suptitle('sin(x)and cos(x)')
plt.show()
结束啦,撒花花~