我想在绘制图形时仅绘制正值(例如ML中的RELU函数)
这可能是一个愚蠢的问题。我希望不是。
在下面的代码中,我迭代并更改基础列表数据。我真的只想在绘图时间更改值,而不更改源列表数据。那可能吗?
#create two lists in range -10 to 10
x = list(range(-10, 11))
y = list(range(-10, 11))
#this function changes the underlying data to remove negative values
#I really want to do this at plot time
#I don't want to change the source list. Can it be done?
for idx, val in enumerate(y):
y[idx] = max(0, val)
#a bunch of formatting to make the plot look nice
plt.figure(figsize=(6, 6))
plt.axhline(y=0, color='silver')
plt.axvline(x=0, color='silver')
plt.grid(True)
plt.plot(x, y, 'rx')
plt.show()
答案 0 :(得分:2)
我建议在绘制时使用numpy并过滤数据:
import numpy as np
import matplotlib.pyplot as plt
#create two lists in range -10 to 10
x = list(range(-10, 11))
y = list(range(-10, 11))
x = np.array(x)
y = np.array(y)
#a bunch of formatting to make the plot look nice
plt.figure(figsize=(6, 6))
plt.axhline(y=0, color='silver')
plt.axvline(x=0, color='silver')
plt.grid(True)
# plot only those values where y is positive
plt.plot(x[y>0], y[y>0], 'rx')
plt.show()
这根本不会绘制y <0的点。相反,如果您想将任何负值替换为零,则可以按照以下步骤操作
plt.plot(x, np.maximum(0,y), 'rx')
答案 1 :(得分:0)
看似有点复杂,但可以动态过滤数据:
plt.plot(list(zip(*[(x1,y1) for (x1,y1) in zip(x,y) if x1>0])), 'rx')
说明:将数据成对处理以使(x,y)保持同步更加安全,然后必须将对转换回单独的xlist和ylist。