用于网格线(不是轮廓)的颜色条在matplotlib中绘制阴谋
我在给Matplotlib中的阴谋网格绘制颜色条时遇到了问题。用于网格线(不是轮廓)的颜色条在matplotlib中绘制阴谋
我有一个地块的网格,其中每个显示64行。这些曲线描述了在64个不同的特定超参数值h
下对相同系统进行优化时的惩罚值与时间的关系。
由于有很多行,而不是使用标准图例,我想使用一个颜色条,并通过h
的值为行着色。换句话说,我喜欢的东西,看起来像这样:
以上是通过添加新的轴来保存彩条,完成通过调用figure.add_axes([0.95, 0.2, 0.02, 0.6])
,传递轴位置明确作为参数传递该方法。然后通过实例化ColorbarBase()
,如示例代码here中那样创建颜色条。对单个地块来说没什么问题,但我想制作一个如上所述的地块。
要做到这一点,我尝试了倍增子图的数量,并使用每个其他子图轴作为颜色条。不幸的是,这导致了colorbars具有相同尺寸/形状的曲线:
有没有办法像在1x2的网格上方的次要情节的网格萎缩只是次要情节彩条?
理想情况下,如果颜色条只是与它描述的线条图共享相同的轴,那就太好了。我看到colorbar.colorbar()功能有斧子参数:
斧头
父轴对象的部分空间用于新的彩条轴将被窃取。
听起来很不错,但colorbar.colorbar()
需要你在imshow图像通过,或ContourSet
,但我的剧情既不是图像也不是等高线图。使用ColorbarBase
可以达到相同的(轴共享)效果吗?
事实证明,只要给定行中的所有图都具有相同的高度,并且给定列中的所有图具有相同的宽度,就可以拥有不同形状的子图。
您可以使用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=1
和num_columns=1
,这看起来像:
没有必要使用colorbarbase。要在轴'ax'上设置一个颜色条,你可以调用'fig.colorbar(scalar_to_color_map,ax = ax)'并且在轴的右侧默认获得一个与轴相同高度的颜色条(只要它是不是一些具有相同方面的特殊轴)。 – ImportanceOfBeingErnest