等高线图上的限制标签

Limiting clabel on contour plot

我正在尝试使用 matplotlib.pyplotcontour() 函数绘制一个函数。我尝试将 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()