我是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文档中找到并阅读了不同的示例,但是该死的...不可能
我缺少明显的东西吗?
非常感谢
[英语不是我的母语]
答案 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()