在 matplotlib 中绘制三角函数的周期

Plotting periods of a trig function in matplotlib

我正在编写一些简单的脚本来绘制给定三角函数(在本例中为正弦函数)的图形。

我的问题是我只想绘制给定三角函数的两个周期。澄清一下,在三角学中,周期是一个波占据的长度(在图表上)。对于sin和cos,一个周期是2pi.

我想使用我现有的代码,并且(最好)使用 matplotlib,绘制我给定的三角函数的两个周期,并将图表上的几个点与我的函数上的几个点对齐。

如果可能的话,我希望能够绘制我的函数,以便第一个周期的开始与我的第一个标签对齐,第一个周期的最高点与第二个标签对齐,点其中我的函数与第三个标签交叉 x 轴,第四个标签与最低点交叉,第二个周期的第一个 period/beginning 结束与第五个标签。然后这种模式将在第二个时期重复。从这里开始,我将把 x 标签称为“句点标记”。

我为此提出了三种可能的解决方案:

  1. 我可以将图表的边界(在本例中为 x = -4 和 x = 4)设置为分别标记为第一个和第九个周期标记,然后以某种方式将我的函数限制在图表内。
  2. 我可以通过某种方式在 matplotlib 中设置一个参数来仅绘制 4pi(两个句点的长度)单位的线,尽管在那种情况下,我认为句点标记不会与他们的匹配想要的分数。
  3. 如果 matplotlib 支持它,我可以找到图形的低点、x 截距和高点,然后从左到右将我的周期标记分配给每个点。这将具有消除仅绘制两个周期的必要性的优势,因为周期标记将指示两个周期的开始和结束。

下面我插入了一些内容:

  1. 我的代码绘图部分的副本,包含示例方程和一些示例周期标记
  2. 给定示例方程的图形截图
  3. 每个周期标记在理想情况下应对齐的位置的可视化表示,以及划分两个完整周期估计值的线。

正弦函数的标准形式是 y = aSIN(bx-c)+d。这里的方程只是 sin(x),但您可以看到变量 c 和 d 如何在确定图形中发挥作用。通常,xlabels 数组将填充脚本中较早确定的变量,顶部的所有变量(func、a、b、c、d)也是如此。

import math
import matplotlib.pyplot as plt
import numpy as np

func = sin
a = 1
b = 1
c = 0
d = 0
xlabels = np.array(['-2pi', '-3pi/2', '-pi', '-pi/2',
                    '0','pi/2', 'pi', '3pi/2','2pi'])

xlabelcount = -4, -3, -2, -1, 0, 1, 2, 3, 4
x = np.arange(-4, 4, 0.01)
if func == 'sin':
    ypoints = a*np.sin(2*x-c)+d
if func == 'cos':
    ypoints = a*np.cos(2*x+c)+d
if b < 0:
    plt.gca().invert_yaxis()

plt.title('Wave Function')
plt.xlabel('Period (Not to Scale)')
plt.ylabel('Amplitude')
plt.grid(True, which='both')
plt.axhline(y=0, color='k')
plt.plot(x, ypoints)
plt.xticks(ticks=xlabelcount,labels=xlabels)
plt.show()

Plot of sin(x) Preferred Period Marking placements

我希望这能让我全面了解我所面临的问题,如有任何帮助,我们将不胜感激。我觉得我已经做了相当多的谷歌搜索,但没有找到好的答案。如果我遗漏了一些非常明显的东西,我提前道歉。

谢谢, 恐惧学习者

如果我理解正确,您想在 x 轴上某些预定义位置(周期标记)的曲线上添加点。如果这是正确的,最好的方法是评估函数在那些特定“周期标记”处的值并将其绘制为一个点。类似于:

fn = "sin"

if fn == "sin":
    fn = np.sin

elif fn == "cos":
    fn = np.cos

# if required, the next three statements can be 
# customized for each function by shifting them
# inside the if ... else blocks
 
x = np.linspace(-2*np.pi, 2*np.pi, 1000)
points = [i * np.pi/2 for i in range(-4, 5)]
labels = ["-2π", "-3π/2", "-π", "-π/2", "0", "π/2", "π", "3π/2", "2π"]

fig, ax  = plt.subplots()
ax.plot(x, fn(x))
ax.set_xticks(points)
ax.set_xticklabels(labels)

# the next line is what you probably want
for pt in points:
    ax.plot(pt, fn(pt), "ok")

ax.hlines(0, x[0], x[-1], "r")

plt.show()

看起来像这样: