17

我正在绘制一些具有几个不连续性的函数。每个函数都以列表的形式给出。我只想在函数连续的地方用线连接点。

这是情节正在做什么的简化示例。

x=linspace(0,1,100)    
y=zeros(100)
y[x<0.5] = x[x<0.5]
y[x>=0.5] = 1 + x[x>=0.5]
plot(x, y, '-o')

在 x=0.5 处存在不连续性,但绘图将所有点与线连接起来。

我的功能当然不同。它们通常在不同的地方有几个不连续性。不连续性的标准很简单。比如说,如果函数跳跃超过 0.5,我认为它在这一点上是不连续的。

plot 中是否有一个选项可以告诉它删除函数不连续点之间的连接线?我记得使用 gnuplot 可以轻松做到这一点。

4

2 回答 2

29

使用 nan 将线分成多个段:

import numpy as np
from pylab import *
x=linspace(0,1,100)    
y=zeros(100)
y[x<0.5] = x[x<0.5]
y[x>=0.5] = 1 + x[x>=0.5]

pos = np.where(np.abs(np.diff(y)) >= 0.5)[0]

x[pos] = np.nan
y[pos] = np.nan

plot(x, y, '-o')

编辑:

在不连续处插入 nan:

pos = np.where(np.abs(np.diff(y)) >= 0.5)[0]+1
x = np.insert(x, pos, np.nan)
y = np.insert(y, pos, np.nan)

在此处输入图像描述

于 2012-04-30T04:05:13.633 回答
0

这是我绘制 tan(x) 的建议:

import matplotlib.pyplot as plt
from math import *
x_lim = 3*pi/2
y_lim = 5
n = 1000
X = []
Y = []
Z = []
for i in range(0,2*n):
    x = -x_lim + i*x_lim/n
    y = tan(x)
    if y<y_lim and y>-y_lim:
        X.append(x)
        Y.append(y)
    else:
        if len(X)>0 and len(Y)>0:
            Z.append([X,Y])
            del X,Y
            X = []
            Y = []
for i in range(0, len(Z)):
    plt.plot(Z[i][0],Z[i][1])
plt.grid(True)
plt.show()
于 2020-01-28T22:08:44.793 回答