【问题标题】:Why do matplotlib contour labels make contours disappear?为什么 matplotlib 轮廓标签会使轮廓消失?
【发布时间】:2021-01-11 20:58:54
【问题描述】:

样本数据生成如下,

import matplotlib as mpl
print(mpl.__version__) # 3.3.3
import matplotlib.pyplot as plt
import numpy as np

def f(x, y=0):
    return np.piecewise(x, [x < 1, np.logical_and(1 <= x, x < 10), x >= 10], [lambda x: 0, lambda x: (x - 1) / 9 * 1000, lambda x: 1000])

x = np.logspace(-5, 5, 100)
y = np.logspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = f(X, Y)

我尝试使用以下代码进行绘图,但调用clabel 后某些轮廓消失了。

fig, ax = plt.subplots(figsize=(5, 3), dpi=120)
cr = ax.contour(X, Y, Z, levels=3, colors='black')
ax.clabel(cr, inline=True, fontsize=8, fmt='%d')
ax.set_xscale('log')
ax.set_yscale('log')
plt.show()

即使等高线宽度和标签字号减小,此问题仍然存在。

fig, ax = plt.subplots(figsize=(5, 3), dpi=120)
cr = ax.contour(X, Y, Z, levels=3, colors='black', linewidths=0.6)
ax.clabel(cr, inline=True, fontsize=3, fmt='%d')
ax.set_xscale('log')
ax.set_yscale('log')
plt.show()

我不知道如何解决 contourclabel 的奇怪行为,我怀疑这是由于它们与对数刻度不兼容。

【问题讨论】:

    标签: python matplotlib contour


    【解决方案1】:

    这确实是对数轴的问题,尤其是在渐近线零附近。但是,为什么不在绘图前定义对数轴,以便 matplotlib 在绘图时考虑到这一点?

    import matplotlib as mpl
    print(mpl.__version__) # 3.3.3
    import matplotlib.pyplot as plt
    import numpy as np
    
    def f(x, y=0):
        return np.piecewise(x, [x < 1, np.logical_and(1 <= x, x < 10), x >= 10], [lambda x: 0, lambda x: (x - 1) / 9 * 1000, lambda x: 1000])
    
    x = np.logspace(-5, 5, 100)
    y = np.logspace(-5, 5, 100)
    X, Y = np.meshgrid(x, y)
    Z = f(X, Y)
    
    fig, ax = plt.subplots(figsize=(5, 3), dpi=120)
    ax.set_xscale('log')
    ax.set_yscale('log')
    cr = ax.contour(X, Y, Z, levels=3, colors='black')
    ax.clabel(cr, inline=True, fontsize=8, fmt='%d')
    
    plt.show()
    

    示例输出:

    【讨论】:

      猜你喜欢
      • 2016-01-12
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 2015-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多