长时间读者还是第一次发布海报。我试图编写一个简单的用户输入正弦图形抽屉,它会影响图形的频率,幅度和相移。我们的目标是将所有内容都用于pi,以便将数学和物理学生介绍给弧度。
我的问题是,我在标题中收到错误,同时试图检测单词' pi'在用户输入中并将其转换为np.pi以用作浮点数。该程序的代码(除此pi部分以外的工作)发布在下面:
import sys
import matplotlib.pyplot as plt
import numpy as np
a = float(input("Amplitude of the curve: "))
f = float(input("Frequency of the curve: "))
p = input("Phase shift of the curve: ")
if "pi" in p:
str.translate(np.pi, "pi")
float(p)
else: float(p)
x = np.linspace(0, 2*np.pi, 1000)
y = a*np.sin((f*x)+p)
plt.grid()
plt.xlabel('x = angle(rads)', fontsize=18)
plt.ylabel('y = amplitude', fontsize=18)
plt.title('The Sine Function', fontsize=26)
plt.xticks(np.linspace(0,2*np.pi,5), ['0', '$\pi$/2', '$\pi$', '3$\pi$/2', '2$\pi$'])
plt.yticks(np.arange(min(y), max(y)+1, max(y)), [round(min(y)), '0', round(max(y))])
plt.plot(x, y)
plt.show()
savefile = input("Do you wish to save the file? ")
if "no" in savefile:
sys.exit()
elif "yes" in savefile:
plt.grid()
plt.xticks(np.linspace(0,2*np.pi,5), ['0', '$\pi$/2', '$\pi$', '3$\pi$/2', '2$\pi$'])
plt.yticks(np.arange(min(y), max(y)+1, max(y)), [round(min(y)), '0', round(max(y))])
plt.plot(x, y)
filename = input("Name the file: ")
plt.savefig(filename, format='pdf', bbox_inches='tight', pad_inches=0.3)
else: print("\n","Invalid input. Ending Script" ,sep="", end="\n \n")
sys.exit()
提前致谢
答案 0 :(得分:1)
您的错误是由于以下行:
y = a*np.sin((f*x)+p)
因为你没有将p
转换成浮点数。在以下命令中(你还有一个坏的缩进,你需要纠正它):
if "pi" in p:
str.translate(np.pi, "pi")
float(p)
float
功能不是和就地功能,您需要再次将其分配给p
:
if "pi" in p:
str.translate(np.pi, "pi")
p=float(p)
答案 1 :(得分:1)
首先,正如@Kasra所说,打电话
float(p)
不修改对象p
。相反,它返回一个新的float对象。因此,您需要保存对其返回内容的引用,例如:
p = float(p)
但是,str.translate(np.pi, "pi")
并没有按照您的想法行事。事实上,当你调用它时,你应该收到一个错误。 translate
是一种字符串对象的方法,用于将特定字符替换为其他特定字符。您不能使用它来将子字符串"pi"
替换为浮点对象np.pi
,因为字符串不能包含浮点数。
你想要的可能更像是:
if 'pi' in p:
p = p.replace('pi', '')
p = np.pi * float(p)
else:
p = float(p)
此外,您可以通过挂在图形对象上并保存它而不是创建新图形来简化matplotlib部分。
例如(我正在运行python 2.x,所以我做了一些小的改动。唯一的区别是raw_input
vs input
和from __future__ import print_function
。):
from __future__ import print_function
import matplotlib.pyplot as plt
import numpy as np
a = float(raw_input("Amplitude of the curve: "))
f = float(raw_input("Frequency of the curve: "))
p = raw_input("Phase shift of the curve: ")
if "pi" in p:
p = np.pi * float(p.replace('pi', ''))
else:
p = float(p)
x = np.linspace(0, 2*np.pi, 1000)
y = a*np.sin((f*x)+p)
fig, ax = plt.subplots()
ax.grid()
ax.set_xlabel('x = angle(rads)', fontsize=18)
ax.set_ylabel('y = amplitude', fontsize=18)
ax.set_title('The Sine Function', fontsize=26)
ax.set(xticks=np.linspace(0,2*np.pi,5),
xticklabels=['0', '$\pi$/2', '$\pi$', '3$\pi$/2', '2$\pi$'],
yticks=np.arange(min(y), max(y)+1, max(y)),
yticklabels=[round(min(y)), '0', round(max(y))])
ax.plot(x, y)
plt.show()
savefile = raw_input("Do you wish to save the file? ")
if "no" in savefile:
pass
elif "yes" in savefile:
fig.savefig('filename.pdf', bbox_inches='tight', pad_inches=0.3)
else:
print("\nInvalid input. Ending Script\n\n")