【问题标题】:Create a discrete colorbar in matplotlib在 matplotlib 中创建一个离散的颜色条
【发布时间】:2019-04-21 00:01:31
【问题描述】:

我尝试了其他线程,但不知道如何解决。我正在尝试创建一个离散的彩条。大部分代码似乎都在工作,确实出现了一个离散条,但标签错误并引发错误:“没有找到可用于创建颜色条的可映射对象。首先定义一个可映射对象,例如图像(使用 imshow)或一个等高线集(带有contourf)。”

很确定错误是因为我在 plt.colorbar 中缺少一个参数,但不确定它要求什么或如何定义它。

以下是我所拥有的。感谢您的任何想法:

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

fig, ax = plt.subplots()
norm = mpl.colors.BoundaryNorm(np.arange(-0.5,4), cmap.N) 

ex2 = sample_data.plot.scatter(x='order_count', y='total_value',c='cluster', marker='+', ax=ax, cmap='plasma', norm=norm, s=100, edgecolor ='none', alpha=0.70)

plt.colorbar(ticks=np.linspace(0,3,4))
plt.show()

【问题讨论】:

    标签: python matplotlib colorbar


    【解决方案1】:

    确实,colorbar 的第一个参数应该是ScalarMappable,这将是散点图PathCollection 本身。

    设置

    import numpy as np
    import matplotlib as mpl
    import matplotlib.pyplot as plt
    import pandas as pd
    
    df = pd.DataFrame({"x" : np.linspace(0,1,20),
                       "y" : np.linspace(0,1,20),
                       "cluster" : np.tile(np.arange(4),5)})
    
    cmap = mpl.colors.ListedColormap(["navy", "crimson", "limegreen", "gold"])
    norm = mpl.colors.BoundaryNorm(np.arange(-0.5,4), cmap.N) 
    

    熊猫密谋

    问题是 pandas 没有让你直接访问这个ScalarMappable。因此,可以从坐标区中的集合列表中捕获它,如果只有一个集合存在,这很容易:ax.collections[0]

    fig, ax = plt.subplots()
    df.plot.scatter(x='x', y='y', c='cluster', marker='+', ax=ax, 
                    cmap=cmap, norm=norm, s=100, edgecolor ='none', alpha=0.70, colorbar=False)
    
    fig.colorbar(ax.collections[0], ticks=np.linspace(0,3,4))
    plt.show()
    

    Matplotlib 绘图

    可以考虑直接使用 matplotlib 来绘制散点图,在这种情况下,您可以直接使用 scatter 函数的返回值作为 colorbar 的参数。

    fig, ax = plt.subplots()
    scatter = ax.scatter(x='x', y='y', c='cluster', marker='+', data=df,
                    cmap=cmap, norm=norm, s=100, edgecolor ='none', alpha=0.70)
    
    fig.colorbar(scatter, ticks=np.linspace(0,3,4))
    plt.show()
    

    两种情况下的输出是相同的。

    【讨论】:

    • 由于值是离散的,所以您可以使用 range(4) 而不是 np.linspace(0,3,4),结果将是相同的(除非您想坚持使用 NumPy 范围)。
    • 如果我不希望它是数字 0、1、2、3 怎么办?而是命名为“A”、“B”、“C”、“D”
    猜你喜欢
    • 2017-01-28
    • 1970-01-01
    • 2014-12-20
    • 2016-04-07
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多