python - 仅颜色条,具有自定义颜色、值和渐变
问题描述
我是 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 的范围内均等分布。
提供位置时,不能直接使用值,而需要将它们映射到单位区间。为此,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()
推荐阅读
- selenium - Selenium 登录到超时异常的 WSJ 错误
- javascript - 为什么 Router() Express 函数返回未定义?
- javascript - VueJs Laravel设置中的GrapeJs包,图标onclick事件未触发
- javascript - Webpack 服务器用 index.html 替换所有文件内容
- javascript - 动态视频尺寸
- typescript - 逗号表达式打字稿 4.4.x 输出
- reactjs - 有没有办法在没有花括号的 tsx typescript 代码中进行评论?
- visual-studio - 如何使用 Visual Studio 查找 Blazor 组件(用 razor 编写)的用法?
- kubernetes - Helm 遍历两个子列表
- graalvm - 可以在没有隔离的情况下创建可从 C 调用的 Graal 本机函数吗?