Python Matplotlib:如何;削减;色条中不需要的部分?

Python Matplotlib:如何;削减;色条中不需要的部分?,python,matplotlib,colorbar,Python,Matplotlib,Colorbar,假设您使用imshow创建图像,如下所示: plt.set_cmap('viridis') im=plt.imshow(mydata, interpolation='nearest',origin='lower') plt.title('mymap') cbar=plt.colorbar() a=round(mydata.max(),0) cbar.set_ticks([17,23,a]) cbar.set_ticklabels([17,23,a]) 假设您有一个连续的like数据集,其中大多

假设您使用
imshow
创建图像,如下所示:

plt.set_cmap('viridis')
im=plt.imshow(mydata, interpolation='nearest',origin='lower')
plt.title('mymap')
cbar=plt.colorbar()
a=round(mydata.max(),0)
cbar.set_ticks([17,23,a])
cbar.set_ticklabels([17,23,a])
假设您有一个连续的like数据集,其中大多数值为0,但是有一个跳转导致最高值的范围

如何“剪切”颜色栏,以确保它从
mydata.min()=17
,到
mydata.max()=27
,而不改变图像中的颜色?


我不想要这个:

试试:

fig, ax = plt.subplots()
cax = ax.imshow(mydata,interpolation='nearest',origin='lower')
cbar = fig.colorbar(cax, ticks=[17,23,a])
cbar.ax.set_yticklabels(["add your label names"])

plt.show()
另请参见:

尝试:

fig, ax = plt.subplots()
cax = ax.imshow(mydata,interpolation='nearest',origin='lower')
cbar = fig.colorbar(cax, ticks=[17,23,a])
cbar.ax.set_yticklabels(["add your label names"])

plt.show()

另请参见:

没有标准的解决方案来限制颜色栏中的颜色范围,因为显示的颜色通常直接链接到图像中的颜色

因此,解决方案是创建一个独立于图像的颜色条,填充不同的颜色贴图。这张额外的彩色地图可以从原始地图上剪下所需的相应部分

import matplotlib.pyplot as plt
import matplotlib
import matplotlib.colors
import numpy as np

# some data between 0 and 27
image = np.random.rand(30,60)*27
image[:,30:] = np.sort(image[:,30:].flatten()).reshape(30,30)


plt.figure(figsize=(8,3))
cmap = plt.get_cmap('jet')
im=plt.imshow(image, interpolation='nearest',origin='lower', cmap = cmap)
plt.title('mymap')


a=round(image.max(),0)

vmin=17  #minimum value to show on colobar
vmax = a #maximum value to show on colobar
norm = matplotlib.colors.Normalize(vmin=vmin, vmax =vmax)
#generate colors from original colormap in the range equivalent to [vmin, vamx] 
colors = cmap(np.linspace(1.-(vmax-vmin)/float(vmax), 1, cmap.N))
# Create a new colormap from those colors
color_map = matplotlib.colors.LinearSegmentedColormap.from_list('cut_jet', colors)

# create some axes to put the colorbar to
cax, _  = matplotlib.colorbar.make_axes(plt.gca())
cbar = matplotlib.colorbar.ColorbarBase(cax, cmap=color_map, norm=norm,)

cbar.set_ticks([17,23,a])
cbar.set_ticklabels([17,23,a])

plt.show()

没有标准的解决方案来限制颜色栏中的颜色范围,因为显示的颜色通常直接链接到图像中的颜色

因此,解决方案是创建一个独立于图像的颜色条,填充不同的颜色贴图。这张额外的彩色地图可以从原始地图上剪下所需的相应部分

import matplotlib.pyplot as plt
import matplotlib
import matplotlib.colors
import numpy as np

# some data between 0 and 27
image = np.random.rand(30,60)*27
image[:,30:] = np.sort(image[:,30:].flatten()).reshape(30,30)


plt.figure(figsize=(8,3))
cmap = plt.get_cmap('jet')
im=plt.imshow(image, interpolation='nearest',origin='lower', cmap = cmap)
plt.title('mymap')


a=round(image.max(),0)

vmin=17  #minimum value to show on colobar
vmax = a #maximum value to show on colobar
norm = matplotlib.colors.Normalize(vmin=vmin, vmax =vmax)
#generate colors from original colormap in the range equivalent to [vmin, vamx] 
colors = cmap(np.linspace(1.-(vmax-vmin)/float(vmax), 1, cmap.N))
# Create a new colormap from those colors
color_map = matplotlib.colors.LinearSegmentedColormap.from_list('cut_jet', colors)

# create some axes to put the colorbar to
cax, _  = matplotlib.colorbar.make_axes(plt.gca())
cbar = matplotlib.colorbar.ColorbarBase(cax, cmap=color_map, norm=norm,)

cbar.set_ticks([17,23,a])
cbar.set_ticklabels([17,23,a])

plt.show()

它没有像我预期的那样工作。它完全按照您在示例中看到的那样离开栏。@d.griner您的解决方案不符合问题中用粗体字母书写的要求。我想我误解了。我以为我们的目标是17个是深蓝色,27个是黄色。这并不像我预期的那样有效。它完全按照您在示例中看到的那样离开栏。@d.griner您的解决方案不符合问题中用粗体字母书写的要求。我想我误解了。我认为目标是17个是深蓝色,27个是黄色。我喜欢这个,但是(小问题警告)想要去掉右手边的部分。但是我想我不能,因为它是创建正确颜色条的“基线”。我喜欢这个,但是(小问题警告)想去掉右边部分。但我想我不能,因为它是创建正确颜色条的“基线”。