通过键盘的输入得到自己想要的折线图,并保存该折线图的数据。
如下图所示,输入左图中键盘值,右图会做相应的动作。其中右图中的点的颜色由W和S控制,红色表示增加,蓝色表示减少;点的移动由A和D控制,输入A表示左移,输入D表示右移。
注意:
- 只接受小写的单个字母和[1,999]数值,输入其他的会提示输入错误或者图片不做变化。
- 是在控制台中输入。比如,想要点右移,输入D并按[enter];想输入某个值,输入[某个值]并按[enter]。
- 有第一次输入后,继续按[enter]会继续上次的操作。比如,上次操作是右移,按[enter]继续右移;上次操作是增加某个值,按[enter]继续增加那个值。
- 因为保存的是小数点后三位,所以输入的值会相应的缩小1000倍。
|
|
代码如下:
import matplotlib.pyplot as plt
import pandas as pd
def save_csv(arr, csv_filename=None):
if csv_filename == None:
csv_filename = "csv.csv"
arr_df = pd.DataFrame(arr)
arr_df.to_csv(csv_filename, float_format='%.3f', index=False, header=False)
def drawing(arr, ret, i, sign, ret_arr):
c_set = ['c', 'm', 'y', 'k', 'w', 'b', 'g']
plt.rcParams["axes.grid"] = True
plt.rcParams["grid.linestyle"] = (5, 9)
ax = plt.gca()
ax.cla()
ax.spines['bottom'].set_position(('data', 0))
ax.spines['left'].set_position(('data', 0))
plt.plot(arr, ret, lw=3, c='r', alpha=0.9, label=str(i)+' '+sign)
if sign == 'u':
plt.plot(arr[i], ret[i], 'ro', markersize=10, c='r')
else:
plt.plot(arr[i], ret[i], 'ro', markersize=10, c='b')
for i in range(len(ret_arr)):
plt.plot(arr, ret_arr[i], lw=3, c=c_set[i], alpha=0.9, label=str(i+1))
plt.xlim((0, 1))
plt.ylim((0, 1))
plt.xticks([0, 0.2, 0.4, 0.6, 0.8, 1], ['0', '0.2', '0.4', '0.6', '0.8', '1'])
plt.yticks([0, 0.2, 0.4, 0.6, 0.8, 1], ['0', '0.2', '0.4', '0.6', '0.8', '1'])
# Setting the chart title and label the axes
plt.title("Showing plot", fontsize=18)
plt.xlabel("X", fontsize=14)
plt.ylabel("Y", fontsize=14)
# Setting the scale mark size
plt.tick_params(axis='both', labelsize=14, direction='in')
plt.legend()
plt.pause(0.1)
def updata_ret(getkey, i, sign):
if getkey == 'w':
sign = 'u'
elif getkey == 's':
sign = 'd'
elif getkey == 'd':
i = i + 1
if i > len(ret)-1:
i = len(ret)-1
elif getkey == 'a':
i = i - 1
if i < 0:
i = 0
elif '1' <= getkey <= '999':
err = 1 #solve the problem of input type "23e"
for val in getkey:
if val < '1' or val > '9':
err = 0
if err:
if sign == 'u':
ret[i] = ret[i] + int(getkey) / 1000
if sign == 'd':
ret[i] = ret[i] - int(getkey) / 1000
else:
print("you input error!")
return i, sign
arr = [0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.63, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.93, 0.95, 1]
ret = [0.009,0.197,0.394,0.565,0.688,0.757,0.797,0.823,0.837,0.848,0.851,0.854,0.856,0.858,0.860,0.862,0.864,0.869,0.873,0.875,0.877,0.878,0.880]
ret_arr = []
i = 0 #Control the points in the graph, a for left shift and d for right shift
#The point in the control chart increases or decreases, the input w indicates an increase, and the input s indicates a decrease
sign = 'u'
while 1:
drawing(arr, ret, i, sign, ret_arr)
getkey = input()
if getkey == 'q':
ret_arr.append(ret)
break
elif getkey == '':
i, sign = updata_ret(cont, i, sign)
elif getkey == 'e':
ret_arr.append(ret)
ret = [0.009,0.197,0.394,0.565,0.688,0.757,0.797,0.823,0.837,0.848,0.851,0.854,0.856,0.858,0.860,0.862,0.864,0.869,0.873,0.875,0.877,0.878,0.880]
else:
i, sign = updata_ret(getkey, i, sign)
cont = getkey
save_csv(ret_arr)
运行结果如下:
|
|