等高线图上的限制标签
Limiting clabel on contour plot
我正在尝试使用 matplotlib.pyplot
的 contour()
函数绘制一个函数。我尝试将 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()
我正在尝试使用 matplotlib.pyplot
的 contour()
函数绘制一个函数。我尝试将 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()