添加额外的等高线,使用2D等高线绘图。

12

我正在使用matplotlib创建一个二维等高线图。根据提供的文档http://matplotlib.org/examples/pylab_examples/contour_demo.html,可以通过以下方式创建这样的等高线图

import matplotlib
import numpy as np
import matplotlib.cm as cm
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt

delta = 0.025
x = np.arange(-3.0, 3.0, delta)
y = np.arange(-2.0, 2.0, delta)
X, Y = np.meshgrid(x, y)
Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
# difference of Gaussians
Z = 10.0 * (Z2 - Z1)

plt.figure()
CS = plt.contour(X, Y, Z)
plt.clabel(CS, inline=1, fontsize=10)
plt.title('Simplest default with labels')

这里是输出以下图形的代码。 enter image description here 文档详细介绍了如何手动标记现有图形上的特定轮廓(或“线条”)。我的问题是如何创建比显示的更多的轮廓线。
例如,所示的图形具有两个二元高斯分布。右上角有三条轮廓线,分别为0.5、1.0和1.5。
我应该如何添加例如0.75和1.25的轮廓线?
此外,理论上,我应该能够缩放并从(例如)1.0和1.5处添加数十条轮廓线。如何实现这一点?
1个回答

13

要在指定的水平值上绘制等值线,请在.contour中设置levels参数:

levels = np.arange(-1.0,1.5,0.25)
CS = plt.contour(X, Y, Z, levels=levels)

import numpy as np
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt

delta = 0.025
x = np.arange(-3.0, 3.0, delta)
y = np.arange(-2.0, 2.0, delta)
X, Y = np.meshgrid(x, y)
Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
# difference of Gaussians
Z = 10.0 * (Z2 - Z1)

plt.figure()
levels = np.arange(-1.0,1.5,0.25)
CS = plt.contour(X, Y, Z, levels=levels)
plt.clabel(CS, inline=1, fontsize=10)
plt.title('levels = {}'.format(levels.tolist()))
plt.show()

在此输入图像描述

这里的第六个图 使用这种方法以 levels = np.arange(-1.2, 1.6, 0.2)绘制等高线。


要缩放,请设置所需区域的x限制和y限制:

plt.xlim(0, 3)
plt.ylim(0, 2)

要自动选择24个水平等级进行绘制,请使用

CS = plt.contour(X, Y, Z, 24)

例如,

import numpy as np
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt

delta = 0.025
x = np.arange(-3.0, 3.0, delta)
y = np.arange(-2.0, 2.0, delta)
X, Y = np.meshgrid(x, y)
Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
# difference of Gaussians
Z = 10.0 * (Z2 - Z1)

plt.figure()
N = 24
CS = plt.contour(X, Y, Z, N)
plt.clabel(CS, inline=1, fontsize=10)
plt.title('{} levels'.format(N))
plt.xlim(0, 3)
plt.ylim(0, 2)
plt.show()

enter image description here

这里的第三张图片使用该方法绘制了六条等值线。


有没有一种自动为所有轮廓设置标签的方法?如何实现这一点? - ShanZhengYang
请查看这里的例子:http://matplotlib.org/examples/pylab_examples/contour_label_demo.html。 - unutbu
不,它默认情况下不会。这就是让我困惑的地方。原始图可能已经被标记了,但如果我放大某些区域(设置x限制和y限制),则没有标签。所给出的示例并未解决此问题。也许我应该开一个新问题... - ShanZhengYang
对不起,我不认为我知道你问题的答案。 - unutbu
我在这个问题上开了一个新的提问:https://dev59.com/U43da4cB1Zd3GeqPwCyQ - ShanZhengYang
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接