【问题标题】:Create a colorbar without a mappable in matplotlib在 matplotlib 中创建一个没有可映射的颜色条
【发布时间】:2020-10-14 14:23:05
【问题描述】:

要调用plt.colorbar,我需要一个“可映射”,我通常由plt.imshowplt.contour 创建。没有这些,是否有一种“合理”的方式来创建可映射对象?

更具体地说,我的代码如下:

import matplotlib.pyplot as plt
from matplotlib.cm import viridis

colors = viridis(np.linspace(0,1,10))
for i, col in enumerate(colors):
    plt.plot(i, 'o', color = col)

然后我想打电话给plt.colorbar,但我没有可映射的。 我通常的工作是cmap = plt.scatter(np.linspace(0,1), np.full(50, np.nan), c = np.linspace(0,1)),它工作得非常好,但我觉得非常丑。

【问题讨论】:

    标签: python matplotlib colorbar


    【解决方案1】:

    在这种情况下,您不仅可以使用scatter 生成可映射对象,还可以同时完成所有工作(绘制点,并返回相应的可映射对象)。

    编辑

    一般来说,Matplotlib 总是提供一种创建对象集合的方法(例如参见LineCollection usage example),允许绘制具有不同属性(如颜色、线宽等)的线条(或任何其他对象)集合。

    import matplotlib.pyplot as plt
    import numpy as np
    
    colors = np.linspace(0,1,10)
    mappable = plt.scatter(np.zeros(10), colors, s=30, c=colors, cmap='viridis')
    plt.colorbar(mappable)
    plt.show()
    

    产生如下图像

    【讨论】:

    • 对于这种情况是正确的。我想我把我的代码简化了很多。在实际代码中,for 循环的每次迭代都会生成一行。使用轮廓可能会有一些工作,但这需要大量的脑力劳动。
    • 我明白了。只是为了让您知道,一般来说,Matplotlib 总是提供一种从对象集合中生成可映射的方法(请参阅the documentation about collections)。我会更新答案。
    【解决方案2】:

    matplotlib doccolorbar 接受ColorMappable 对象。所以我们可以用ScalarMappableNormalize创建这样一个对象:

    from matplotlib.cm import ScalarMappable
    from matplotlib.colors import Normalize
    
    colors = viridis(np.linspace(0,1,10))
    for i, col in enumerate(colors):
        plt.plot(i, 'o', color = col)
    
    cmappable = ScalarMappable(Normalize(0,1))
    plt.colorbar(cmappable)
    

    输出:

    【讨论】:

    • 使用上面的代码我得到了错误:TypeError: You must first set_array for mappable。我在 plt.colorbar(cmappable) 之前添加了 cmappable.set_array([0,1]) 行,这工作正常,但不确定实际发生了什么/这是否是正确的用法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    相关资源
    最近更新 更多