【问题标题】:Adding extra contour lines using matplotlib 2D contour plotting使用 matplotlib 2D 等高线绘图添加额外的等高线
【发布时间】:2015-07-19 09:16:41
【问题描述】:

我正在使用 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')

输出以下图。

文档详细说明了如何在现有绘图上手动标记某些轮廓(或“线”)。我的问题是如何创建比所示更多的轮廓线。

例如,显示的图有两个二元高斯。右上角有三个等高线,分别位于0.51.01.5

如何在 0.751.25 上添加等高线?

另外,我应该能够放大并(原则上)添加来自(例如)1.01.5 的数十条等高线。如何做到这一点?

【问题讨论】:

    标签: python matplotlib plot


    【解决方案1】:

    要在指定级别值处绘制等值线,请在.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()
    

    The sixth figure here 使用此方法在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()
    

    The third figure here 使用此方法绘制 6 条等值线。

    【讨论】:

    • 有没有办法自动为所有轮廓设置标签?如何做到这一点?
    • 看看例子,here
    • 感谢您的回复。我想我在问一个更简单的问题:假设我希望 plt.show() 始终返回带有每个数值标记的轮廓。没有办法通过plt.clabel(CS, etc.) 设置此行为吗?给出的示例创建了一个“标签类”,以便通过某种格式的标签——我对给出的格式很满意。
    • 不是每个轮廓(等值线)都已经被标记了吗?如果您对格式感到满意,需要更改哪些内容?
    • 不,默认情况下不会。这让我感到困惑。原始图可能被标记,但如果我放大某些区域(设置x 限制和y 限制),则没有标签。给出的例子并没有解决这个问题。也许我应该提出一个新问题....
    猜你喜欢
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 2017-07-12
    • 2017-07-24
    • 2014-09-09
    相关资源
    最近更新 更多