亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Matplotlib 中非線性顏色條的統一刻度標簽

Matplotlib 中非線性顏色條的統一刻度標簽

繁花如伊 2023-03-30 09:49:44
我正在尋找一種解決方案來創建具有統一刻度標簽的顏色條(沿顏色條等距),即使邊界是非線性的。目前,由于刻度線是根據邊界值按比例分布的,因此顏色條的頂部被拉伸得相當厲害,而底部被壓縮得很厲害,以至于無法看到哪些顏色對應于哪個值。我想保持相同的顏色/值組合,但帶有使顏色欄清晰可見的刻度標簽間距。我使用當前代碼獲得的顏色條:這是我使用的代碼:import matplotlib as mplfrom matplotlib.backends.backend_agg import FigureCanvasAggfrom matplotlib.colors import LinearSegmentedColormapfrom matplotlib.figure import Figure# databounds = [0.1, 0.25, 0.5, 1, 2.5, 5, 7.5, 10, 15, 20, 25, 50, 100]style_color = [[0, 0, 127],               [0, 0, 197],               [0, 21, 254],               [0, 126, 254],               [0, 231, 254],               [68, 253, 186],               [153, 254, 101],               [238, 254, 16],               [254, 187, 0],               [254, 101, 0],               [254, 16, 0],               [197, 0, 0],               [127, 0, 0],               [127, 0, 0]]# transform color rgb value to 0-1 rangecolor_arr = []for color in style_color:    rgb = [float(value)/255 for value in color]    color_arr.append(rgb)# normalize bound valuesnorm = mpl.colors.Normalize(vmin=min(bounds), vmax=max(bounds))normed_vals = norm(bounds)# create a colormapcmap = LinearSegmentedColormap.from_list(    'my_palette',    list(zip(normed_vals, color_arr[:-1])),    N=256    )cmap.set_over([color for color in color_arr[-1]])cmap.set_under([color for color in color_arr[0]])# create a figurefig = Figure(figsize=(2, 5))canvas = FigureCanvasAgg(fig)ax = fig.add_subplot(121)# create the colorbarcb = mpl.colorbar.ColorbarBase(ax,                               cmap=cmap,                               norm=norm,                               extend='max',                               ticks=bounds)fig.savefig('non-linear_colorbar')
查看完整描述

1 回答

?
拉風的咖菲貓

TA貢獻1995條經驗 獲得超2個贊

ABoundaryNorm似乎是你要找的東西:


import matplotlib as mpl

from matplotlib.colors import LinearSegmentedColormap, BoundaryNorm

from matplotlib import pyplot as plt


# data

bounds = [0.1, 0.25, 0.5, 1, 2.5, 5, 7.5, 10, 15, 20, 25, 50, 100]

style_color = [[0, 0, 127],

               [0, 0, 197],

               [0, 21, 254],

               [0, 126, 254],

               [0, 231, 254],

               [68, 253, 186],

               [153, 254, 101],

               [238, 254, 16],

               [254, 187, 0],

               [254, 101, 0],

               [254, 16, 0],

               [197, 0, 0],

               [127, 0, 0],

               [127, 0, 0]]


# transform color rgb value to 0-1 range

color_arr = []

for color in style_color:

    rgb = [float(value) / 255 for value in color]

    color_arr.append(rgb)


# normalize bound values

norm = mpl.colors.BoundaryNorm(bounds, ncolors=256)


# create a colormap

cmap = LinearSegmentedColormap.from_list('my_palette', color_arr, N=256)


# create a figure

fig, ax = plt.subplots(figsize=(2, 5), gridspec_kw={'left': 0.4, 'right': 0.5})


# create the colorbar

cb = mpl.colorbar.ColorbarBase(ax, cmap=cmap, norm=norm, extend='max', ticks=bounds)

plt.show()

http://img1.sycdn.imooc.com//6424eb080001ca6006520222.jpg

PS:如果你需要一個平滑的顏色條,你可以拉伸邊界:


import numpy as np


bounds = [0.1, 0.25, 0.5, 1, 2.5, 5, 7.5, 10, 15, 20, 25, 50, 100]

stretched_bounds = np.interp(np.linspace(0, 1, 257), np.linspace(0, 1, len(bounds)), bounds)


# normalize stretched bound values

norm = mpl.colors.BoundaryNorm(stretched_bounds, ncolors=256)


# ....

cb = mpl.colorbar.ColorbarBase(ax, cmap=cmap, norm=norm, extend='max', ticks=bounds)

http://img1.sycdn.imooc.com//6424eb170001d11c06540256.jpg

PS:new_y = np.interp(new_x, old_x, old_y)通過首先在舊 x 的數組中查找 x 并找到對應的舊 y 來為 y 插入新值。當新 x 位于兩個舊 x 之間時,新 y 將按比例位于舊 y 之間。

對于BoundaryNorm,np.interp計算所有中間值以獲得 256 個不同的級別,而不是原來的 13 個。


查看完整回答
反對 回復 2023-03-30
  • 1 回答
  • 0 關注
  • 185 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號