【问题标题】:colorbars for grid of line (not contour) plots in matplotlibmatplotlib 中线网格(非等高线)图的颜色条
【发布时间】:2016-08-12 12:23:33
【问题描述】:

我在为 Matplotlib 中的线图网格提供颜色条时遇到问题。

我有一个图表网格,每个图表显示 64 行。这些线条描绘了在某个超参数h 的 64 个不同值下优化同一系统时的惩罚值与时间的关系。

由于行数太多,我不想使用标准图例,而是使用颜色条,并根据h 的值对行进行着色。换句话说,我想要看起来像这样的东西:

以上是通过添加一个新的轴来保存颜色条,通过调用figure.add_axes([0.95, 0.2, 0.02, 0.6]),将轴位置作为参数显式传递给该方法来完成的。然后,通过实例化 ColorbarBase(),创建颜色条,如示例代码 here 中所示。这对于单个地块来说很好,但我想制作一个像上面那样的地块网格。

为此,我尝试将子图的数量增加一倍,并使用其他所有子图轴作为颜色条。不幸的是,这导致颜色条与绘图具有相同的大小/形状:

有没有办法只缩小子图网格中的颜色条子图,如上面的 1x2 网格?

理想情况下,如果颜色条与它所描述的线图共享同一轴,那就太好了。我看到colorbar.colorbar()函数有一个ax参数:

斧头

父坐标区对象,新颜色条坐标区的空间将从该对象中被盗。

听起来不错,除了 colorbar.colorbar() 要求您传入 imshow 图像或 ContourSet,但我的图既不是图像也不是等高线图。使用ColorbarBase可以达到同样的(分轴)效果吗?

【问题讨论】:

    标签: matplotlib


    【解决方案1】:

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

    您可以使用 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,如下所示:

    【讨论】:

    • 不需要使用colorbarbase。要在坐标轴ax 上有一个颜色条,您可以调用fig.colorbar(scalar_to_color_map, ax=ax) 并默认在轴的右侧获得一个与坐标轴高度相同的颜色条(只要它不是一些具有相同纵横比的特殊轴) )。
    猜你喜欢
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 2017-12-08
    • 2013-08-14
    • 1970-01-01
    相关资源
    最近更新 更多