代码之家  ›  专栏  ›  技术社区  ›  kilojoules

pyplot colorbar有一个多余的小数点。最大值应该是1.00,但显示为1.05

  •  1
  • kilojoules  · 技术社区  · 8 年前

    所以我做了一个等高线图,我的色条有一个假值。数据严格介于0和1之间。为什么1.05会出现?我怎样才能把最上面的数字定为1.00?

    import numpy as np
    import matplotlib.pyplot as plt
    
    x = np.linspace(1,10, 100)
    z = np.random.uniform(0, 1, 100**2).reshape((100, 100))
    plt.contourf(x, x, z, cmap=plt.cm.coolwarm, vmin=0., vmax=1.)
    cbar = plt.colorbar()
    print(cbar.get_clim()) # (0.0, 1.0)
    

    colorbar problem example

    2 回复  |  直到 8 年前
        1
  •  1
  •   mostlyoxygen    8 年前

    绘制等高线时 contourf 函数自动选择它认为最合适的级别值来为每个数据点指定颜色。这有点类似于将数据放入直方图中。颜色栏中的每个分段都反映了其中一个级别。

    在本例中,它选择创建7个级别,matplotlib正在努力(出于我承认我不理解的原因)以适应colorbar。

    您可以通过指定 轮廓线 函数应使用并选择一个值,该值将为您提供更可接受的颜色条(您可能不希望低于自动选择的级别数):

    plt.contourf(x, x, z, 10, cmap=plt.cm.coolwarm)
    plt.colorbar()
    

    Correctly spaced ticks

    或者,如果你真的想离开 轮廓线 要做出此决定,可以调整颜色栏上的刻度:

    plt.contourf(x, x, z, cmap=plt.cm.coolwarm)
    plt.colorbar(ticks=np.linspace(0, 1, 5))
    

    Colorbar with adjusted ticks

        2
  •  1
  •   ImportanceOfBeingErnest    8 年前

    另一个答案肯定是次优的。

    要自定义等高线或等高线图的色条级别,需要使用 levels 争论。

    例如,要使10个标高的0.1间距介于0和1之间,可以创建一个linspace np.linspace(0,1,11) 把它提供给 水平 争论。注意,水平表示箱子 边缘 ,这样我们就比垃圾箱多拿一个边。

    import numpy as np
    import matplotlib.pyplot as plt
    
    x = np.linspace(1,10, 100)
    z = np.random.uniform(0, 1, 100**2).reshape((100, 100))
    
    levels = np.linspace(0,1,11)
    
    plt.contourf(x, x, z, levels=levels, cmap=plt.cm.coolwarm, vmin=0., vmax=1.)
    cbar = plt.colorbar()
    
    
    plt.show()
    

    enter image description here