如何在python`matplotlib`中向轮廓图添加线条?

gui*_*ion 5 python plot matplotlib

我具有以下功能来说明一些轮廓线:

"""
Illustrate simple contour plotting, contours on an image with
a colorbar for the contours, and labelled contours.

See also contour_image.py.
"""
import matplotlib
import numpy as np
import matplotlib.cm as cm
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt

matplotlib.rcParams['xtick.direction'] = 'out'
matplotlib.rcParams['ytick.direction'] = 'out'

X = np.arange(-1.2, 1.2, 0.005)
Y = np.arange(-1.2, 1.2, 0.005)
X, Y = np.meshgrid(X, Y)
Z = (np.ones([np.shape(X)[0],np.shape(X)[1]])-X)**2+100*(Y-(X)**2)**2


# Create a simple contour plot with labels using default colors.  The
# inline argument to clabel will control whether the labels are draw
# over the line segments of the contour, removing the lines beneath
# the label
levels = np.arange(-100.0, 600, 1.0)
plt.figure()
CS = plt.contour(X, 
                 Y, 
                 Z,
                 levels=levels,
                )
plt.clabel(CS, 
           np.array(filter(lambda lev: lev <5.0, levels)),
           inline=0.5, 
           fontsize=10,
           fmt='%1.1f'
          )

plt.hold(True)


plt.plot(np.arange(-1.0, 1.0, 0.005),
        np.arange(-1.0, 1.0, 0.005),
        np.ones(len(np.arange(-1.0, 1.0, 0.005)))*100, '-k')

plt.title('Contour Lines and Constraint of Rosenbrock Optimiztion Problem')
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

如果将线条注释掉,轮廓图看起来很棒。...:

# plt.hold(True)


# plt.plot(np.arange(-1.0, 1.0, 0.005),
#         np.arange(-1.0, 1.0, 0.005),
#         np.ones(len(np.arange(-1.0, 1.0, 0.005)))*100, '-k')
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

...但是我无法像我需要的那样将线条叠加在情节上。我只需要将它们叠加在等高线图的顶部即可。做这个的最好方式是什么?

我知道R中可能,但是在Python使用中如何做到这一点matplotlib

ali*_*i_m 4

plt.plot从一系列 x 和 y 坐标绘制一条二维线。每个点没有关联的 z 坐标,因此无需传入第三个数组参数。目前plt.plot正在将这些数组解释为两条单独线的坐标,并且正在执行相当于:

plt.plot(np.arange(-1.0, 1.0, 0.005), np.arange(-1.0, 1.0, 0.005))
plt.plot(np.ones(len(np.arange(-1.0, 1.0, 0.005)))*100, '-k')
Run Code Online (Sandbox Code Playgroud)

由于第二行包含最多 100 的 x 和 y 坐标,因此轴将自动重新缩放,以便等值线图不再清晰。

我认为您可能正在考虑zorder=参数(它应该只是一个标量而不是一个数组)。在这种情况下没有必要 - 因为您在轮廓线之后绘制线,所以zorder默认情况下它应该高于轮廓线。您可以删除第三个数组参数plt.plot

另外,由于您只用两个点绘制一条直线,因此您只需要传递起点和终点坐标:

plt.plot([-1, 1], [-1, 1], '-k')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述