如何在matplotlib颜色条中创建自定义断点?
我借用从matplotlib定制CMAP示例页面的示例:如何在matplotlib颜色条中创建自定义断点?
https://matplotlib.org/examples/pylab_examples/custom_cmap.html
这产生相同的图像具有不同数量的阴影的轮廓,如在段的数目指定:n_bins
:
https://matplotlib.org/_images/custom_cmap_00.png
但是,我不仅对桶的数量感兴趣,而且还对颜色值之间的具体断点感兴趣。例如,当nbins=6
右上角的插曲,我怎么能指定的垃圾箱的范围,以使得阴影填充这些自定义方面:
n_bins_ranges = ([-10,-5],[-5,-2],[-2,-0.5],[-0.5,2.5],[2.5,7.5],[7.5,10])
是否也可以指定休息的包容性点?例如,我想在-2和0.5之间的范围内指定是-2 < x <= -0.5
还是-2 <= x < -0.5
。
与回答以下编辑:
使用下面的接受的答案,这里是绘制每一步,包括代码最后加入定制的彩条蜱连线的中点处。请注意,由于我是新用户,因此无法发布图片。
设置数据和6个色垃圾桶:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
# Make some illustrative fake data:
x = np.arange(0, np.pi, 0.1)
y = np.arange(0, 2*np.pi, 0.1)
X, Y = np.meshgrid(x, y)
Z = np.cos(X) * np.sin(Y) * 10
# Create colormap with 6 discrete bins
colors = [(1, 0, 0), (0, 1, 0), (0, 0, 1)] # R -> G -> B
n_bin = 6
cmap_name = 'my_list'
cm = matplotlib.colors.LinearSegmentedColormap.from_list(
cmap_name, colors, N=n_bin)
情节不同的选择:
# Set up 4 subplots
fig, axs = plt.subplots(2, 2, figsize=(6, 9))
fig.subplots_adjust(left=0.02, bottom=0.06, right=0.95, top=0.94, wspace=0.05)
# Plot 6 bin figure
im = axs[0,0].imshow(Z, interpolation='nearest', origin='lower', cmap=cm)
axs[0,0].set_title("Original 6 Bin")
fig.colorbar(im, ax=axs[0,0])
# Change the break points
n_bins_ranges = [-10,-5,-2,-0.5,2.5,7.5,10]
norm = matplotlib.colors.BoundaryNorm(n_bins_ranges, len(n_bins_ranges))
im = axs[0,1].imshow(Z, interpolation='nearest', origin='lower', cmap=cm, norm=norm)
axs[0,1].set_title("Custom Break Points")
fig.colorbar(im, ax=axs[0,1])
# Arrange color labels by data interval (not colors)
im = axs[1,0].imshow(Z, interpolation='nearest', origin='lower', cmap=cm, norm=norm)
axs[1,0].set_title("Linear Color Distribution")
fig.colorbar(im, ax=axs[1,0], spacing="proportional")
# Provide custom labels at color midpoints
# And change inclusive equality by adding arbitrary small value
n_bins_ranges_arr = np.asarray(n_bins_ranges)+1e-9
norm = matplotlib.colors.BoundaryNorm(n_bins_ranges, len(n_bins_ranges))
n_bins_ranges_midpoints = (n_bins_ranges_arr[1:] + n_bins_ranges_arr[:-1])/2.0
im = axs[1,1].imshow(Z, interpolation='nearest', origin='lower', cmap=cm ,norm=norm)
axs[1,1].set_title("Midpoint Labels\n Switched Equal Sign")
cbar=fig.colorbar(im, ax=axs[1,1], spacing="proportional",
ticks=n_bins_ranges_midpoints.tolist())
cbar.ax.set_yticklabels(['Red', 'Brown', 'Green 1','Green 2','Gray Blue','Blue'])
plt.show()
可以使用BoundaryNorm
如下:
import matplotlib.pyplot as plt
import matplotlib.colors
import numpy as np
x = np.arange(0, np.pi, 0.1)
y = np.arange(0, 2*np.pi, 0.1)
X, Y = np.meshgrid(x, y)
Z = np.cos(X) * np.sin(Y) * 10
colors = [(1, 0, 0), (0, 1, 0), (0, 0, 1)] # R -> G -> B
n_bin = 6 # Discretizes the interpolation into bins
n_bins_ranges = [-10,-5,-2,-0.5,2.5,7.5,10]
cmap_name = 'my_list'
fig, ax = plt.subplots()
# Create the colormap
cm = matplotlib.colors.LinearSegmentedColormap.from_list(
cmap_name, colors, N=n_bin)
norm = matplotlib.colors.BoundaryNorm(n_bins_ranges, len(n_bins_ranges))
# Fewer bins will result in "coarser" colomap interpolation
im = ax.imshow(Z, interpolation='nearest', origin='lower', cmap=cm, norm=norm)
ax.set_title("N bins: %s" % n_bin)
fig.colorbar(im, ax=ax)
plt.show()
或者,如果你想比例间隔,即颜色之间的距离根据它们的值,
fig.colorbar(im, ax=ax, spacing="proportional")
作为boundary norm documentation状态
如果
b[i] <= v < b[i+1]
则v被映射到色彩焦耳;当我从0变到len(边界)-2时,j从0变为ncolors-1。
所以颜色总是选择为-2 <= x < -0.5
,以获得对方的等号,你将需要提供 像n_bins_ranges = np.array([-10,-5,-2,-0.5,2.5,7.5,10])-1e-9
太棒了!感谢您传递文档链接并建议添加(而不是减去,正确?)一个任意的小数字,以改变平等的一面。为了继续使颜色条数字线性间隔,我将如颜色条api中所讨论的那样通过规范参数'fig.colorbar(im,ax = ax,norm = norm)'? https://matplotlib.org/api/colorbar_api.html#matplotlib.colorbar。ColorbarBase – user8732262
我更新了答案,我认为你的意思是线性间距。 – ImportanceOfBeingErnest
你实际上并不意味着问题中回答你的问题(因为如果你已经回答了这个问题就不会再有问题了,对吗?)相反,你可以为自己的问题提供一个答案。 – ImportanceOfBeingErnest