2016-08-12 93 views
0

我在给Matplotlib中的阴谋网格绘制颜色条时遇到了问题。用于网格线(不是轮廓)的颜色条在matplotlib中绘制阴谋

我有一个地块的网格,其中每个显示64行。这些曲线描述了在64个不同的特定超参数值h下对相同系统进行优化时的惩罚值与时间的关系。

由于有很多行,而不是使用标准图例,我想使用一个颜色条,并通过h的值为行着色。换句话说,我喜欢的东西,看起来像这样:

line plot with color bar

以上是通过添加新的轴来保存彩条,完成通过调用figure.add_axes([0.95, 0.2, 0.02, 0.6]),传递轴位置明确作为参数传递该方法。然后通过实例化ColorbarBase(),如示例代码here中那样创建颜色条。对单个地块来说没什么问题,但我想制作一个如上所述的地块。

要做到这一点,我尝试了倍增子图的数量,并使用每个其他子图轴作为颜色条。不幸的是,这导致了colorbars具有相同尺寸/形状的曲线:

awkward square-shaped colorbar

有没有办法像在1x2的网格上方的次要情节的网格萎缩只是次要情节彩条?

理想情况下,如果颜色条只是与它描述的线条图共享相同的轴,那就太好了。我看到colorbar.colorbar()功能有斧子参数:

斧头

父轴对象的部分空间用于新的彩条轴将被窃取。

听起来很不错,但colorbar.colorbar()需要你在imshow图像通过,或ContourSet,但我的剧情既不是图像也不是等高线图。使用ColorbarBase可以达到相同的(轴共享)效果吗?

回答

0

事实证明,只要给定行中的所有图都具有相同的高度,并且给定列中的所有图具有相同的宽度,就可以拥有不同形状的子图。

您可以使用gridspec.GridSpec来完成此操作,如this answer中所述。

所以我用线图设置列的宽度要比使用彩条的列宽20倍。代码如下:

grid_spec = gridspec.GridSpec(num_rows, 
            num_columns * 2, 
            width_ratios=[20, 1] * num_columns) 
    colormap_type = cm.cool 

    for (x_vec_list, 
     y_vec_list, 
     color_hyperparam_vec, 
     plot_index) in izip(x_vec_lists, 
          y_vec_lists, 
          color_hyperparam_vecs, 
          range(len(x_vecs))): 

     line_axis = plt.subplot(grid_spec[grid_index * 2]) 
     colorbar_axis = plt.subplot(grid_spec[grid_index * 2 + 1]) 

     colormap_normalizer = mpl.colors.Normalize(vmin=color_hyperparam_vec.min(), 
                vmax=color_hyperparam_vec.max()) 
     scalar_to_color_map = mpl.cm.ScalarMappable(norm=colormap_normalizer, 
                cmap=colormap_type) 

     colorbar.ColorbarBase(colorbar_axis, 
           cmap=colormap_type, 
           norm=colormap_normalizer) 

     for (line_index, 
      x_vec, 
      y_vec) in zip(range(len(x_vec_list)), 
          x_vec_list, 
          y_vec_list): 
      hyperparam = color_hyperparam_vec[line_index] 
      line_color = scalar_to_color_map.to_rgba(hyperparam) 

      line_axis.plot(x_vec, y_vec, color=line_color, alpha=0.5) 

对于num_rows=1num_columns=1,这看起来像:

enter image description here

+1

没有必要使用colorbarbase。要在轴'ax'上设置一个颜色条,你可以调用'fig.colorbar(scalar_to_color_map,ax = ax)'并且在轴的右侧默认获得一个与轴相同高度的颜色条(只要它是不是一些具有相同方面的特殊轴)。 – ImportanceOfBeingErnest