首页 > 解决方案 > 仅颜色条,具有自定义颜色、值和渐变

问题描述

我是 matplotlib 的新手,正在努力用自定义值绘制一个 colorBar。

更具体地说,我只需要绘制一个颜色条,而不是相关的图形,为此我有一个颜色值列表,以及每种颜色的对应值;

我基本上尝试了两种不同的方法,但无法得到我想要的:

import matplotlib as mpl
from matplotlib import pyplot as plt

colors = [ #1A6AD0, #3D98E3, #79C4E9, #055A05, #99C48C, #AC8C1A  ]
values = [ -1800 , -1200, -1, 0, 600 , 1200 ]

fig = plt.figure( figsize=(2,4) )
ax = fig.add_axes([0, 0.05, 0.25, 0.9])

# First option :
cmap = LinearSegmentedColormap.from_list("mypalette", colors, N=1000)         
norm = mpl.colors.Normalize(vmin=min(values), vmax=max(values))  
cb = mpl.colorbar.ColorbarBase(ax, cmap=cmap, norm=norm, orientation='vertical') # also tried to add ticks=values here but no ..doesnt work ..  Color palette has a nice gradient but values do not match their colors. not even with spacing = 'uniform' or 'proportional' ...

# Second option :
norm2 = mpl.colors.BoundaryNorm(values, cmap.N)
cb = mpl.colorbar.ColorbarBase(ax, cmap=cmap, norm=norm2, spacing='proportional' , orientation='vertical', ticks=values ) # Values correspond to the rights colors, but there is no gradient

所以,我的问题是,在第一种情况下,我设法有一个漂亮的颜色渐变,但值(将是刻度)没有出现在正确的“颜色位置”(例如绿色面 600 而它应该面对100) 所有的麻烦都来自于我认为我的价值观不是均匀分布的。但我无法改变它们!

在第二种情况下,我在颜色和值之间有正确的对应关系,但是颜色现在是离散的(由块显示),这真的很烦人(不仅是为了视觉目的)

对于对应于 -1 和 0 的值,我特别期待从蓝色到绿色的快速颜色转换

不幸的是,当我使用安全的计算机进行编程时,我无法在此处显示图片,但是我在第一种和第二种方法中获得的结果与本页中的前两张图片相似:https ://matplotlib.org/tutorials/colors/colorbar_only .html#sphx-glr-tutorials-colors-colorbar-only-py

当然,我想要获得的是一个具有漂亮颜色渐变和颜色 <-> 值之间正确对应关系的 ColorBar

我在网上找到并阅读了不同的例子,尤其是在这里和 matplotlib 文档,但是该死的......不可能

我错过了一些明显的东西吗?

非常感谢

[英语不是我的母语]

标签: pythonmatplotlibcolorbar

解决方案


我想您想在创建颜色图时提供颜色的相应位置。否则,颜色在 0 到 1 的范围内均等分布。
提供位置时,不能直接使用值,而需要将它们映射到单位区间。为此,norm可以使用与创建颜色条相同的方法。

import matplotlib as mpl
from matplotlib import pyplot as plt
from matplotlib.colors import LinearSegmentedColormap

colors = [ "#1A6AD0", "#3D98E3", "#79C4E9", "#055A05", "#99C48C", "#AC8C1A"]
values = [ -1800 , -1200, -1, 0, 600 , 1200 ]

fig = plt.figure( figsize=(2,4) )
ax = fig.add_axes([0, 0.05, 0.25, 0.9])

norm = mpl.colors.Normalize(vmin=min(values), vmax=max(values))  
normed_vals = norm(values)

cmap = LinearSegmentedColormap.from_list("mypalette", list(zip(normed_vals, colors)), N=1000)  
cb = mpl.colorbar.ColorbarBase(ax, cmap=cmap, norm=norm, orientation='vertical')

plt.show()

在此处输入图像描述


推荐阅读