我正在尝试使用contour()
的matplotlib.pyplot
函数绘制函数。我尝试将clabel
添加到绘图中,但不想为每个级别(仅前几个)添加标签。从各种演示和文档中,我可以了解以下内容:
import matplotlib.pyplot as plt
import numpy as np
def f(x1, x2):
return (x2 - x1)**4 + 8 * x2 * x1 - x1 + x2 + 3
x1 = np.linspace(-2,2,1000)
x2 = np.linspace(-2,2,1000)
X1, X2 = np.meshgrid(x1, x2)
F = f(X1, X2)
F = np.clip(F, a_min=None, a_max=50)
contours = plt.contour(X1, X2, F, 50, cmap="rainbow")
print(contours.levels)
plt.clabel(contours, contours.levels[0:8], inline=True, fontsize=10, fmt="f = %1.1f", use_clabeltext=True)
plt.title('Q3a Solution')
plt.xlabel('x1')
plt.ylabel('x2')
plt.show()
在matplotlib版本2.1.2中运行时,该代码有效,但是在版本3.0.0中运行相同的代码会出现以下错误:
Traceback (most recent call last):
File "Tutorial1.py", line 16, in <module>
plt.clabel(contours, contours.levels[0:8], inline=True, fontsize=10, fmt="f = %1.1f", use_clabeltext=True)
File "/usr/local/lib/python3.7/site-packages/matplotlib/pyplot.py", line 2496, in clabel
return gca().clabel(CS=CS, *args, **kwargs)
TypeError: clabel() got multiple values for argument 'CS'
我已经四处张望,但是如果
clabel
的用法已更改,或者这是一个错误,则无法解决... 最佳答案
这是matplotlib 3.0.0中的错误,现在为fixed。即将发布的3.0.1版本将提供该功能。
请注意,这是一个仅pyplot
的错误。使用面向对象的方法时不会发生这种情况。
因此,它也没有出现在contour label example中。同时,请参考该示例。
此处最简单的解决方法是使用axes
方法代替pyplot,即plt.gca().clabel
代替plt.clabel
import matplotlib.pyplot as plt
import numpy as np
def f(x1, x2):
return (x2 - x1)**4 + 8 * x2 * x1 - x1 + x2 + 3
x1 = np.linspace(-2,2,1000)
x2 = np.linspace(-2,2,1000)
X1, X2 = np.meshgrid(x1, x2)
F = f(X1, X2)
F = np.clip(F, a_min=None, a_max=50)
contours = plt.gca().contour(X1, X2, F, 50, cmap="rainbow")
print(contours.levels)
plt.gca().clabel(contours, contours.levels[0:8], inline=True, fontsize=10,
fmt="f = %1.1f", use_clabeltext=True)
plt.title('Q3a Solution')
plt.xlabel('x1')
plt.ylabel('x2')
plt.show()