Python 3.x Matplotlib-如图所示,在多色线子地块下方添加颜色栏

Python 3.x Matplotlib-如图所示,在多色线子地块下方添加颜色栏,python-3.x,matplotlib,colorbar,imshow,Python 3.x,Matplotlib,Colorbar,Imshow,我有一个多色线图,我想在它下面添加一个颜色栏,如下图所示,是否可能 我已经附加了一个颜色栏图像作为参考,我从另一个代码。 我在这里的意图是将颜色条用作绘图中每一段线的图例 编辑-1:我希望颜色栏使用可映射的对象,例如图像,因此不希望仅为颜色栏创建新的子地块 欢迎提出任何建议。提前谢谢 这是多色线图的代码 import numpy as np import matplotlib.pyplot as plt from matplotlib.collections import L

我有一个多色线图,我想在它下面添加一个颜色栏,如下图所示,是否可能

我已经附加了一个颜色栏图像作为参考,我从另一个代码。 我在这里的意图是将颜色条用作绘图中每一段线的图例

编辑-1:我希望颜色栏使用可映射的对象,例如图像,因此不希望仅为颜色栏创建新的子地块

欢迎提出任何建议。提前谢谢

这是多色线图的代码

import numpy as np    
import matplotlib.pyplot as plt    
from matplotlib.collections import LineCollection
Segments=[[[3,1],[6,1]],[[6,2],[9,2]],[[9,3],[12,3]],[[12,4],[15,4]], [[12,4],[15,4]]]         
Points_1 = np.concatenate([Segments[:-1], Segments[1:]], axis=1) 
lc = LineCollection(Points_1, colors=['r','g','b','y'], linewidths=2)
fig, ax = plt.subplots() 
ax.add_collection(lc)   
ax.autoscale()
plt.show()

这是我正在使用的解决方法:

import numpy as np    
import matplotlib.pyplot as plt    
from matplotlib.collections import LineCollection
import matplotlib.colorbar as mcolorbar
import matplotlib.colors as mcolors



Segments=[[[3,1],[6,1]],[[6,2],[9,2]],[[9,3],[12,3]],[[12,4],[15,4]], [[12,4],[15,4]]]         
Points_1 = np.concatenate([Segments[:-1], Segments[1:]], axis=1) 
lc = LineCollection(Points_1, colors=['r','g','b','y'], linewidths=2)

fig, ax = plt.subplots(2, 1, gridspec_kw={'height_ratios' : [5,1]}) 
ax[0].add_collection(lc)

bounds = np.linspace(0, 1, 5)[:-1]
labels = ['Action1', 'Action2', 'Action3', 'Action4']
ax[0].set_xlim([0, 15])
ax[0].set_ylim([0, 10])
cb2 = mcolorbar.ColorbarBase(ax = ax[1], cmap = cmap, orientation = 'horizontal', extendfrac='auto')
cb2.set_ticks(bounds)
cb2.set_ticklabels(labels)
plt.tight_layout()
plt.show()

如果您特别希望避免子地块,可以使用标量可映射:

fig, ax = plt.subplots() 
ax.add_collection(lc)   
ax.autoscale()
cmap = mcolors.ListedColormap(['r','g','b','y'])
sm = plt.cm.ScalarMappable(cmap=cmap) 
sm.set_array([]) # this line may be ommitted for matplotlib >= 3.1 
cbar = fig.colorbar(sm, ax=ax, orientation='horizontal',aspect=90)
bounds = np.linspace(0, 1, 5)[:-1]
labels = ['Action1', 'Action2', 'Action3', 'Action4']
ax.set_xlim([0, 15])
ax.set_ylim([0, 10])
cbar.set_ticks(bounds)
cbar.set_ticklabels(labels)
plt.tight_layout()
plt.show()

这帮助我得到了我想要的东西

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors    
from matplotlib.collections import LineCollection

Segments=[[[3,1],[6,1]],[[6,2],[9,2]],[[9,3],[12,3]],[[12,4],[15,4]], [[12,4],[15,4]]]         
Points_1 = np.concatenate([Segments[:-1], Segments[1:]], axis=1) 

lc = LineCollection(Points_1, colors=['r','g','b','y'], linewidths=2)
fig, ax = plt.subplots() 
ax.add_collection(lc)   
ax.autoscale()

c=[1,2,3,4,5]
labels = ['Action1', 'Action2', 'Action3', 'Action4']

cmap = mcolors.ListedColormap(['r','g','b','y'])
norm = mcolors.BoundaryNorm([1,2,3,4,5],4)
sm = plt.cm.ScalarMappable(norm=norm, cmap=cmap)
sm.set_array([])  # this line may be ommitted for matplotlib >= 3.1
cbar=fig.colorbar(sm, ticks=c, orientation='horizontal')

cbar.set_ticklabels(['Action1', 'Action2', 'Action3', 'Action4'])
plt.show()

您提供的代码无法运行。抱歉,我遗漏了部分代码。我现在更新了。实际上,我希望通过使用可映射对象(如图像)使颜色栏仅包含1个子图,因为我正在处理的代码可以包含m*n个子图,并且颜色栏将表示所有子图。您能建议如何用可映射对象重现相同的颜色栏吗?很抱歉给出了不完整的要求。谢谢你的回答。实际上,我希望通过使用可映射对象(如图像)使颜色栏仅包含1个子图,因为我正在处理的代码可以包含m*n个子图,并且颜色栏将表示所有子图。您能建议如何用可映射对象重现相同的颜色栏吗?很抱歉,给出的要求不完整。我不确定您为什么不能将此示例推断到您的案例中。在这里,色条完全是人工创建的后验。你能举个例子说明你是如何创建多个子地块的吗?谢谢Liris。经过进一步的研究,你的答案。我添加了这三行以获得所需的颜色栏<代码>sm=plt.cm.ScalarMappable(norm=norm,cmap=cmap)sm.set_数组([])cbar=fig.colorbar(sm,ax=ax,ticks=c,orientation='horizontal',aspect=90)好的!我使用此解决方案编辑了我的答案,如果您满意,您可以接受它供其他人进一步使用:)