我想用从上一点开始的虚线替换函数下降到“-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()
这是原图
修改后的情节:
我编写的代码有效(它产生所需的输出),但是当我在我的(更大的)数据集上实际运行它时,它效率低下并且需要很长时间。有没有更聪明的方法来做到这一点?
最佳答案
我会使用 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()
结果如下所示:
但是请注意,如果第一个值是
-1
,则这将失败,因为您的问题没有明确定义(没有可从中复制的先前值)。希望这可以帮助。关于python - 用虚线替换部分绘图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48260014/