Python 3.x 如何从大列表中选择要在颜色栏中显示的特定颜色数?-Matplotlib

Python 3.x 如何从大列表中选择要在颜色栏中显示的特定颜色数?-Matplotlib,python-3.x,pandas,matplotlib,colorbar,imshow,Python 3.x,Pandas,Matplotlib,Colorbar,Imshow,我绘制了一些包含70个类的数据,因此当我构建颜色栏时,很难区分每个图例,如下所示: 我使用的代码是: formation_colors = # 70 colors formation_labels = # 70 labels data = # the section of the entire dataset which only has 13 labels data = data.sort_values(by='DEPTH_MD') ztop=data.DEPTH_MD.min(); z

我绘制了一些包含70个类的数据,因此当我构建颜色栏时,很难区分每个图例,如下所示:

我使用的代码是:

formation_colors = # 70 colors
formation_labels = # 70 labels
data = # the section of the entire dataset which only has 13  labels


data = data.sort_values(by='DEPTH_MD')
ztop=data.DEPTH_MD.min(); zbot=data.DEPTH_MD.max() 

cmap_formations = colors.ListedColormap(formation_colors[0:len(formation_colors)], 'indexed')
cluster_f = np.repeat(np.expand_dims(data['Formations'].values,1), 100, 1)

fig = plt.figure(figsize=(2,10))
ax = fig.add_subplot()
im_f = ax.imshow(cluster_f, interpolation='none', aspect='auto', cmap = cmap_formations, vmin=0, vmax=69)   
ax.set_xlabel('FORMATION')
ax.set_xticklabels(['']);

divider_f = make_axes_locatable(ax)
cax_f = divider_f.append_axes("right", size="20%", pad=0.05)
cbar_f = plt.colorbar(im_f, cax = cax_f,)

cbar_f.set_ticks(range(0,len(formation_labels))); cbar_f.set_ticklabels(formation_labels)
到目前为止,如果我只是改变一下:

   1. cmap_formations = colors.ListedColormap(formation_colors[0:len(formation_colors)], 'indexed') 
   2. cbar_f.set_ticks(range(0,len(formation_labels))); cbar_f.set_ticklabels(formation_labels)
致:

我得到了,cbar中相应的颜色,但是情节不再正确,而且图例也不一致


如果您知道怎么做,非常感谢。

虽然问题中没有明确提到,但我认为数据['FORMATION']包含从0到69的索引,这些索引包含在FORMATION\u颜色和FORMATION\u标签列表中

主要的问题是,数据['FORMATION']需要重新编号为新的索引,编号为0到12,进入新的唯一颜色列表。np.unique…,return_inverse=True返回唯一数字列表和值的重新编号

为了能够重新索引颜色和标签列表,可以将它们转换为numpy数组

为了使代码更易于调试,下面的测试使用颜色列表和标签列表之间的简单关系

从matplotlib导入pyplot作为plt 从matplotlib导入颜色 从mpl_toolkits.axes_grid1.axes_divider导入使_axes_可定位 将numpy作为np导入 作为pd进口熊猫 编队颜色=np.random.choicelistcolors.CSS4颜色,70,替换=假70随机颜色名称 编队_标签=['lbl_'+c代表编队_颜色]70个标签 地层颜色=np.asarrayformation地层颜色 地层\标签=np.asarrayformation\标签 f=np.random.randint0,70,13 d=np.sortnp.random.randint05300,13 data=pd.DataFrame{'FORMATION':np.repeatf,np.diffnp.append0,d, “DEPTH_MD”:np.aranged[-1]} data=data.sort_valuesby='DEPTH\u MD' ztop=数据['DEPTH_MD'].min zbot=数据['DEPTH_MD'].max 唯一的_值,形成的_新的_值=np。唯一的数据['formation'],返回的_倒数=True cmap\u formations=colors.ListedColormapformation\u colors[唯一值],“索引” 簇f=形成新值。重塑-1,1 fig=plt.figurefigsize=3,10 ax=图添加子批次 im_f=ax.imshowcluster_f,区段=[0,1,zbot,ztop], 插值为“无”,纵横比为“自动”,cmap=cmap_,vmin=0,vmax=lenunique_值-1 ax.set_xlabel'FORMATION' ax.set_xticks[] 分隔器\u f=制造轴\u位置 cax\u f=分隔器\u f.附加\u轴右侧,尺寸=20%,焊盘=0.05 cbar\u f=plt.colorbarim\u f,cax=cax\u f cbar_f.set_ticksnp.linspace0,lenunique_值-1,2*lenunique_值+1[1::2] cbar\u f.设置标签信息\u标签[唯一值] plt.子批次调整左=0.2,右=0.5 节目 这是一个比较图:


辉煌!谢谢你,约翰。
cmap_formations = colors.ListedColormap(formation_colors[0:len(data['FORMATION'].unique())], 'indexed') 

cbar_f.set_ticks(range(0,len(data['FORMATION'].unique()))); cbar_f.set_ticklabels(data['FORMATION'].unique())