我想用从上一点开始的虚线替换函数下降到“-1”的部分绘图(见下图)。

这是我编写的一些代码及其输出:

import numpy as np

import matplotlib.pyplot as plt
y = [5,6,8,3,5,7,3,6,-1,3,8,5]

plt.plot(np.linspace(1,12,12),y,'r-o')
plt.show()

for i in range(1,len(y)):
    if y[i]!=-1:
        plt.plot(np.linspace(i-1,i,2),y[i-1:i+1],'r-o')
    else:
        y[i]=y[i-1]
        plt.plot(np.linspace(i-1,i,2),y[i-1:i+1],'r--o')
plt.ylim(-1,9)
plt.show()

这是原图

python - 用虚线替换部分绘图-LMLPHP

修改后的情节:

python - 用虚线替换部分绘图-LMLPHP

我编写的代码有效(它产生所需的输出),但是当我在我的(更大的)数据集上实际运行它时,它效率低下并且需要很长时间。有没有更聪明的方法来做到这一点?

最佳答案

我会使用 numpy 功能将您的线切割成段,然后分别绘制所有实线和虚线。在下面的示例中,我向您的数据中添加了两个额外的 -1 以查看这是否通用。

import numpy as np
import matplotlib.pyplot as plt

Y = np.array([5,6,-1,-1, 8,3,5,7,3,6,-1,3,8,5])
X = np.arange(len(Y))

idxs =  np.where(Y==-1)[0]

sub_y = np.split(Y,idxs)
sub_x = np.split(X,idxs)

fig, ax = plt.subplots()

##replacing -1 values and plotting dotted lines
for i in range(1,len(sub_y)):
    val = sub_y[i-1][-1]
    sub_y[i][0] = val
    ax.plot([sub_x[i-1][-1], sub_x[i][0]], [val, val], 'r--')

##plotting rest
for x,y in zip(sub_x, sub_y):
    ax.plot(x, y, 'r-o')

plt.show()

结果如下所示:

python - 用虚线替换部分绘图-LMLPHP

但是请注意,如果第一个值是 -1 ,则这将失败,因为您的问题没有明确定义(没有可从中复制的先前值)。希望这可以帮助。

关于python - 用虚线替换部分绘图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48260014/

10-14 05:45