簡體   English   中英

如何使用 matplotlib 以特定值定義顏色來創建線性顏色圖?

[英]How to create a linear colormap with color defined at specific values with matplotlib?

我想創建一個顏色圖,它通過為特定值定義的 colors 線性淡化。 下面是我的最小非工作示例。

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

data = np.random.uniform(0, 10, (10, 10))

values = [0., 0.8, 1., 10.]
colors = ["#ff0000", "#00ff00", "#0000ff", "#cccccc"]

我覺得這可以通過在使用imshow繪圖時使用cmapnorm開關來解決,但我無法成功地使 colors 的平滑梯度通過定義的 colors 值。

cmap = mpl.colors.ListedColormap(colors, name="mycmap")
norm = mpl.colors.BoundaryNorm(values, len(colors))

fig, axe  = plt.subplots()
cmap_ = axe.imshow(data, aspect="auto", origin="upper", cmap=cmap, norm=norm)
cbar = fig.colorbar(cmap_, ax=axe)

比例尺也是非線性的。

在此處輸入圖像描述

如何使用上面提供的值和 colors 設置此顏色圖?

這是我找到的解決問題的當前解決方案:

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
    
def get_colormap(values, colors, name="custom"):
    values = np.sort(np.array(values))
    values = np.interp(values, (values.min(), values.max()), (0., 1.))
    cmap = mpl.colors.LinearSegmentedColormap.from_list(name, list(zip(values, colors)))
    return cmap

data = np.random.uniform(0, 10, (10, 10))
values = np.array([0., 0.8, 1., 10.])
colors = ["#ff0000", "#00ff00", "#0000ff", "#cccccc"]
cmap_ = get_colormap(values, colors)

fig, axe  = plt.subplots()
cmap = axe.imshow(data, aspect="auto", origin="upper", cmap=cmap_)
cbar = fig.colorbar(cmap, ax=axe)

不簡單但實用。 我將保留未回答的問題,以便有機會找到最佳解決方案。

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM