【问题标题】:How to eliminate connecting line when plotting unwrapped function绘制展开函数时如何消除连接线
【发布时间】:2018-11-02 03:31:17
【问题描述】:

我试图弄清楚如何消除在函数被“切碎”时出现的虚假“连接线”,以便仅在单个间隔中绘制它。例如,假设我有一个从 0 到 10 pi(或者甚至更大)的角度函数,并且我只想在 0 到 2 pi 的范围内绘制这个函数。我可以使用模运算来修复数据,但是如果我绘制它,我会得到一条从 2 pi 连接回零的线,我不想绘制它。这是一些显示我在说什么的代码。

import numpy as np
import matplotlib.pyplot as plt

t = np.linspace(0, 10*np.pi, 1000)
y = t + np.sin(t)      
t2 = t%(2*np.pi)
plt.plot(t2, y)
plt.show()

生成的图有一系列我不想要的水平线(见下图)。我对此进行了一些研究,并没有找到任何简单的方法来处理这种情况,但似乎这有点普遍。

有什么想法吗?

顺便说一句,我正在处理一个相当大的数据集,所以我不能很好地“手动”做任何事情。

【问题讨论】:

  • 您是在询问如何在一般情况下创建一个脱节的情节,还是针对这种特定情况?

标签: python matplotlib plot


【解决方案1】:

一般情况下,您可以使用NaN 在点中插入中断。在您展示的特定情况下,您可以使用np.diff 来识别不连续性并将这些位置的t2 值设置为NaN,从而产生所需的中断

import numpy as np
import matplotlib.pyplot as plt

t = np.linspace(0, 10*np.pi, 1000)
y = t + np.sin(t)
t2 = t % (2*np.pi)

# Compute the difference between successive t2 values
diffs = np.append(np.diff(t2), 0)

# Find the differences that are greater than pi
discont_indices = np.abs(diffs) > np.pi

# Set those t2 values to NaN
t2[discont_indices] = np.nan

plt.plot(t2, y)
plt.show()

【讨论】:

  • 像魅力一样工作!非常感谢!
  • 如果是实测数据,你不会喜欢给NaN设置一些值。您需要插入带有NaNs 的行。您甚至可能希望有环绕的连接线。插入 t 值分别为 0.2.*np.pi 的行对,以及一个公共的插值 y 值和一个 NaN 行。
【解决方案2】:

您可以用稍微不同的方式解决相同的问题:创建一个从 0 到 2*pi 的 x 网格,然后为 y 添加偏移量以绘制五条不同的曲线。这里的关键是使用索引[0:-1] 排除t 的最后一点,以避免延续线。

import numpy as np
import matplotlib.pyplot as plt

t = np.linspace(0, 2*np.pi, 1000)
t = (t%(2*np.pi))[0:-1]

for i in range(5):
    y = t+ np.sin(t) + i*2*np.pi
    plt.plot(t, y, 'b')

【讨论】:

    猜你喜欢
    • 2016-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多