Creating plotting function with arbitrary number of input functions
本问题已经有最佳答案,请猛点这里访问。
我在制作一个通用的绘图函数时遇到了一些困难,它绘制了所提供函数的实部和虚部。我想概括我的函数,这样它就可以接受任意数量的函数输入,然后用图例来绘制它们。因此,我应该能够使用以下方法调用函数:
1 2 3 | tester(0.9, func1) tester(0.9, func1, func2) tester(0.9, func1, func2, func3, …) |
功能响应。最紧凑的方法是什么?此外,如果图例可以放在两个子地块之外(因为标签适用于两个地块),则首选。
目前,我只有以下两个功能可以手动绘制:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | import numpy as np import matplotlib.pyplot as plt def tester(radius, func1, func2): theta = np.linspace(0,2.1*np.pi,1000) z = radius*np.exp(1j*theta) w1 = func1(z) w2 = func2(z) fig = plt.figure() ax1 = fig.add_subplot(211) ax2 = fig.add_subplot(212) ax1.plot(theta, np.real(w1), label='%s' % func1) ax2.plot(theta, np.imag(w1)) ax1.plot(theta, np.real(w2), label='%s' % func2) ax2.plot(theta, np.imag(w2)) ax1.legend() ax1.set_ylabel('Real Component') ax2.set_ylabel('Imag Component') ax2.set_xlabel(r'Polar $\theta$ at $r=$%.2f' % radius) plt.show() return 0 def func1(z): return np.sqrt(z) def func2(z): return np.sqrt(z**2-1) tester(0.9, func1, func2) |
号
您应该能够在函数声明中使用args或kwargs(请参见*args和**kwargs)。更多信息)。例如,要传递任意数量的函数,请使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 | def testuser(radius, *args): theta = np.linspace(0,2.1*np.pi,1000) z = radius*np.exp(1j*theta) fig = plt.figure() ax1 = fig.add_subplot(211) ax2 = fig.add_subplot(212) for i, arg in enumerate(args): w = arg(z) ax1.plot(theta, np.real(w), label="Function %s" % i) ax2.plot(theta, np.imag(w)) |
号
您可以使用Kwargs解决标签问题:
1 2 3 4 5 6 | def testuser(radius, **kwargs): # Insert rest of code ... for i, arg in enumerate(kwargs): w = args[arg](z) ax1.plot(theta, np.real(w), label=arg) ax2.plot(theta, np.imag(w)) |
你可以这样称呼:
1 | testuser(0.9, function1=func1, function2=func2, plotlabel=functiondeclaration) |
。
多亏了@chepner,我得到了这个
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | import numpy as np import matplotlib.pyplot as plt def tester(r, **kwargs): theta = np.linspace(0,2.1*np.pi,1000) z = r*np.exp(1j*theta) fig = plt.figure() ax1 = fig.add_subplot(211) ax2 = fig.add_subplot(212) for k,v in kwargs.iteritems(): ax1.plot(theta, np.real(v(z)), label='%s' % k) ax2.plot(theta, np.imag(v(z))) ax1.legend() ax1.set_ylabel('Real Component') ax2.set_ylabel('Imag Component') ax2.set_xlabel(r'Polar $\theta$ at $r=$%.2f' % r) plt.show() return 0 def func1(z): return np.sqrt(z) def func2(z): return np.sqrt(z**2-1) tester(0.9, func1= func1, func2=func2) |