仅颜色栏,具有自定义颜色、值和渐变
Color Bar only, with custom colors , values, and gradient
我是 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
所以,我的问题是,在第一种情况下,我设法获得了漂亮的颜色渐变,但是值(将是刻度)没有出现在右侧 "color position"(例如绿色面对 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()
我是 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
所以,我的问题是,在第一种情况下,我设法获得了漂亮的颜色渐变,但是值(将是刻度)没有出现在右侧 "color position"(例如绿色面对 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()