仅颜色栏,具有自定义颜色,值和渐变

时间:2019-03-04 15:13:24

标签: python matplotlib colorbar

我是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文档中找到并阅读了不同的示例,但是该死的...不可能

我缺少明显的东西吗?

非常感谢

[英语不是我的母语]

1 个答案:

答案 0 :(得分:1)

我想您想在创建颜色图时提供颜色的相应位置。否则,颜色在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()

enter image description here