在Matplotlib中,制作一个传奇(example_legend()
下图)并不太难,但我认为将标签放在正在绘制的曲线上是更好的风格(example_inline()
如下图所示).这可能非常繁琐,因为我必须手动指定坐标,如果我重新格式化绘图,我可能需要重新定位标签.有没有办法在Matplotlib中自动生成曲线上的标签?能够以与曲线角度对应的角度定向文本的加分点.
import numpy as np
import matplotlib.pyplot as plt
def example_legend():
plt.clf()
x = np.linspace(0, 1, 101)
y1 = np.sin(x * np.pi / 2)
y2 = np.cos(x * np.pi / 2)
plt.plot(x, y1, label='sin')
plt.plot(x, y2, label='cos')
plt.legend()
Run Code Online (Sandbox Code Playgroud)
def example_inline():
plt.clf()
x = np.linspace(0, 1, 101)
y1 = np.sin(x * np.pi / 2)
y2 = np.cos(x * np.pi / 2)
plt.plot(x, y1, label='sin')
plt.plot(x, y2, label='cos')
plt.text(0.08, 0.2, 'sin')
plt.text(0.9, 0.2, 'cos')
Run Code Online (Sandbox Code Playgroud)
在Python中,假设我有一些继承自Shape的类Circle.形状需要x坐标和y坐标,此外,圆需要半径.我希望能够通过做类似的事情来初始化Circle,
c = Circle(x=1., y=5., r=3.)
Run Code Online (Sandbox Code Playgroud)
Circle继承自shape,因此我需要使用命名参数__init__
,因为不同的类需要不同的构造函数.我可以手动设置x,y和r.
class Shape(object):
def __init__(self, **kwargs):
self.x = kwargs['x']
self.y = kwargs['y']
class Circle(Shape):
def __init__(self, **kwargs):
super(Circle, self).__init__(**kwargs)
self.r = kwargs['r']
Run Code Online (Sandbox Code Playgroud)
或者,我可以自动使用我的圆圈属性 self.__dict__.update(kwargs)
class Shape(object):
def __init__(self, **kwargs):
self.__dict__.update(**kwargs)
class Circle(Shape):
def __init__(self, **kwargs):
super(Circle, self).__init__(**kwargs)
Run Code Online (Sandbox Code Playgroud)
这样做的好处是代码更少,我不需要维护样板self.foo = kwargs['foo']
.缺点是Circle不需要哪些参数.这被认为是作弊还是这种好风格(只要Circle的界面有详细记录)?
谢谢大家,感谢您的深思熟虑.在self.__dict__.update(**kwargs)
我试验组织我的代码时,hack对我很有用,但我会确保通过明确地正确传递参数并在生产代码中进行明确的错误检查来替换它.
编辑:这个问题是由于一个错误引起的,已在 Scipy 0.15 中修复
当我开发和测试代码时,我可能会犯一个简单的错误,例如 NameError。当我使用 scipy.integrate.odeint 时,odeint 将打印错误消息,但会继续集成我请求的多个时间步,因此我收到许多相同的错误消息。我认为它具有这种行为,以便在发生算术错误(例如除以零)时它可以继续进行,但这对于编程错误来说是无益的行为。
有没有办法让 scipy 在第一条错误消息后停止?如果我能让它因错误而不是算术异常而停止,那就最好了。