通过索引现有的colormap动态修改matplotlib colorbar

时间:2018-02-24 11:32:02

标签: python-3.x matplotlib colorbar colormap

我尝试使用修改后的颜色条创建下图所示的缩放图,仅显示可见数据系列。 enter image description here 通过修改x& y绘图限制,我可以确保每行保持相同的颜色。使用下面的代码片段,我可以找到每个数据系列的索引数组,这些索引在新轴限制( buslist )中可见,然后我使用它来创建一个新的颜色映射( cmap_vals - > cmap_new )。我偶然发现一个example让我非常接近我需要的东西,但我无法弄清楚为什么它没有将所有颜色映射到颜色条,正如你在上一个情节中所看到的那样。请注意, buslist 数组是非顺序(即放大的图中缺少#13)。

# Sort VUFmag array
ars = -np.sort(-VUFmag,axis=-1)*100

fig, ax = plt.subplots(figsize=(6,4))                   # Create figure and axis tuple
x = 100*(np.arange(ars.shape[-1]))/ars.shape[-1]        # Define x-axis as % of time

n = len(ars)
cmap = plt.get_cmap('jet', n)

for i in range(ars.shape[0]):
   ax.plot(x,ars[i,:],color=cmap(i))       # Plot data

# Display limits
xlim=(-0.005,0.1)
ylim=(1.9,np.max(VUFmag*100)*1.05)

# Get bus numbers to be shown on colorbar
buslist = np.unique(np.nonzero(VUFmag > ylim[0]/100)[0])

#Get cmap values
cmap_vals = cmap(np.arange(n))[buslist]

# Define new cmap
cmap_new = matplotlib.colors.LinearSegmentedColormap.from_list('new_cmap', cmap_vals)
norm = matplotlib.colors.BoundaryNorm(np.arange(0,len(buslist)+1)-0.5, len(buslist))

# Define SM
sm = plt.cm.ScalarMappable(cmap=cmap_new, norm=norm)
sm.set_array([])

# Plot colorbar
clb = plt.colorbar(sm, ticks=np.arange(0,len(buslist)), pad=0.01)

# Set colorbar labels
clb.ax.set_yticklabels(buslist+1)
clb.set_label('Bus No.', labelpad=10)

以下是我目前的最佳尝试。我对这里遗失的内容有何见解? enter image description here

0 个答案:

没有答案