【问题标题】:Plotting periods of a trig function in matplotlib在 matplotlib 中绘制三角函数的周期
【发布时间】:2021-06-26 02:56:08
【问题描述】:

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

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

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

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

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

  1. 我可以将图表的边界(在本例中为 x = -4 和 x = 4)分别标记为第一个和第九个周期标记,然后以某种方式将我的函数限制在图表内。李>
  2. 我可以以某种方式在 matplotlib 中设置一个参数以仅绘制 4pi(两个句点的长度)单位的线,但在这种情况下,我不认为句点标记会与他们想要的点相匹配.
  3. 如果 matplotlib 支持它,我可以找到图表的低点、x 截距和高点,然后从左到右将我的周期标记分配给每个。这样做的好处是无需仅绘制两个周期,因为周期标记将指示两个周期的开始和结束。

下面我插入了一些东西:

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

sin 函数的标准形式是 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

我希望这可以全面了解我所面临的问题,并且非常感谢任何帮助。我觉得我已经进行了大量的谷歌搜索,但没有一个好的答案。如果我遗漏了一些非常明显的东西,我提前道歉。

谢谢, 学霸

【问题讨论】:

  • 欢迎来到 StackOverflow!您想为任意三角函数执行此操作还是仅对正弦和余弦执行此操作?
  • 我都可以。我将为其他 4 个(tan、cot、cos 和 sec)三角函数复制一个像这样的脚本,但我认为描述我所拥有的内容会更容易,然后尝试复制任何解决方案用于其他 4 个功能。所以一个任意的三角函数会很好,但如果我能得到关于 sin 和 cos 的帮助,我总是可以向后工作。

标签: python matplotlib plot trigonometry


【解决方案1】:

如果我理解正确,您想在 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()

看起来像这样:

【讨论】:

  • 看起来很完美!太感谢了!我会马上实施它。真的很感激:)
  • 这是你所做的,应用于切线函数,可能吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-14
  • 1970-01-01
  • 2020-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多