【问题标题】:How to add a color bar for vspans created with variable alpha如何为使用可变 alpha 创建的 vspan 添加颜色条
【发布时间】:2023-03-30 04:09:02
【问题描述】:

我想用不同程度的红色来表示每个时间元素的不同重要性并填充该区域。

示例代码如下所示。

import matplotlib.pyplot as plt
X_example = np.random.rand(400)
importance_values = np.random.rand(400)
plt.figure(figsize=(13,7))
plt.plot(X_example)
for j in range(len(X_example)):
    plt.axvspan(xmin=j, xmax=j+1,facecolor="r",alpha=importance_values[j])

它会生成如下图:

现在我想在这个图中添加一个颜色图来显示,例如浅红色表示重要性低,深红色表示重要性高,就像这样:

在我的情况下,我怎样才能做到这一点?

【问题讨论】:

    标签: python matplotlib colormap


    【解决方案1】:

    一种解决方案是创建一个LinearSegmentedColormap,它采用颜色列表并将其转换为matplotlib colorbar 对象。然后就可以设置“alpha通道”了:

    import matplotlib.pyplot as plt
    import numpy as np
    from matplotlib.colors import LinearSegmentedColormap, ListedColormap
    from matplotlib.colorbar import ColorbarBase
    
    X_example = np.random.rand(400)
    importance_values = np.random.rand(400)
    
    fig, (ax, cax) = plt.subplots(ncols=2, figsize=(8,5), gridspec_kw={'width_ratios': [1, 0.05]})
    ax.plot(X_example, color='b')
    for j in range(len(X_example)):
        ax.axvspan(xmin=j, xmax=j+1,facecolor="r",alpha=importance_values[j])
        
    N = 20  # the number of colors/alpha-values in the colorbar
    cmap = LinearSegmentedColormap.from_list(None, ['r' for i in range(N)], N=N)
    alpha_cmap = cmap(np.arange(N))
    alpha_cmap[:,-1] = np.linspace(0, 1, N)
    alpha_cmap = ListedColormap(alpha_cmap, N=N)
    
    cbar = ColorbarBase(cax, cmap=alpha_cmap, ticks=[0., 1],)
    cbar.ax.set_yticklabels(["low importance", "high importance"])
    

    这给出了以下图,其中颜色条的两种颜色具有自定义标签:

    【讨论】:

    • 非常感谢您的帮助!这真的很有帮助,解决了我的问题!
    【解决方案2】:

    您可以创建一个将红色与一系列 alpha 值混合的颜色图:

    import matplotlib.pyplot as plt
    from matplotlib.colors import LinearSegmentedColormap, to_rgba
    from matplotlib.cm import ScalarMappable
    import numpy as np
    
    X_example = np.random.rand(400)
    importance_values = np.random.rand(400)
    
    fig, ax = plt.subplots(figsize=(12, 5))
    ax.plot(X_example)
    for j in range(len(X_example)):
        ax.axvspan(xmin=j, xmax=j + 1, facecolor="r", alpha=importance_values[j])
    ax.margins(x=0)
    
    cmap = LinearSegmentedColormap.from_list(None, [to_rgba('r', 0), 'r'])
    cbar = plt.colorbar(ScalarMappable(cmap=cmap), ticks=[0, 1], pad=0.02)
    cbar.ax.set_yticklabels(["low", "high"], fontsize=20)
    cbar.ax.set_ylabel("importance", labelpad=-30, fontsize=20)
    plt.tight_layout()
    plt.show()
    

    水平颜色条示例:

    cbar = plt.colorbar(ScalarMappable(cmap=cmap), ticks=[0, 1], orientation='horizontal')
    cbar.ax.set_xticklabels(["low", "high"], fontsize=20)
    cbar.ax.set_xlabel("importance", labelpad=-15, fontsize=20)
    

    【讨论】:

    • 如果答案有用,请随时为答案投票。
    猜你喜欢
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多