希望在matplotlib中使用makeaxes绘制三个图形并共享一个色条

1 投票
1 回答
681 浏览
提问于 2025-04-18 02:04

编辑 - 希望这能让事情更清楚。下面是来自 这个帖子的代码,它和我想做的非常相似。

fig, axes = plt.subplots(nrows=2, ncols=2, sharex=True, sharey=True)
for ax in axes.flat:
    im = ax.imshow(np.random.random((10,10)), vmin=0, vmax=1)

cax,kw = mpl.colorbar.make_axes([ax for ax in axes.flat])
plt.colorbar(im, cax=cax, **kw)

plt.show()

对比。

    fig, axes = plt.subplots(nrows = 1, ncols = 3, sharex = True, sharey = True)

    for ax, z_val, unif, rangenum in zip(axes.flat, z_vals, UI, ranges):
    plot = plt.scatter(x_vals, y_vals, s = 5.5 * max(x_vals), c = z_val, cmap = 'rainbow')
        if efficiency_or_not:
            plot.vmin = 0
            plot.vmax = 1
            plot.xlabel = 'Uniformity: ' + unif
        else:
            plot.xlabel = 'Uniformity: ' + unif + '   ' + rangenum + ' ppm'

    cax, kw = mpl.colorbar.make_axes([ax for ax in axes.flat])
    plt.colorbar(plot, cax = cax, **kw)    
    plt.savefig('./'+ figname + '.jpg', dpi = 100)
    plt.close()

我想要的是三个图水平排列,并在下面添加一个颜色条。

原始帖子如下

我找到了 这个,我想用这个技巧……不过我在把它应用到我的情况时遇到了麻烦。

我有三组相同类型的数据。我想把这三幅图合成一幅图,并且只用一个颜色条。我需要在每个报告中做这个五次,还有一组数据我想强制设置最小值和最大值。

我现在的函数如下……我遇到的错误是:

plot_that_2(x_vals, y_vals, plots_list[j], plots_list[j+1], plots_list[j+2],plots_names_list[j], Plots_dictionary[plot_strings_list[i]][0],Plots_dictionary[plot_strings_list[i]][1])

cax, kw = mpl.colorbar.make_axes([ax for ax in axes.flat])

pb = parent.get_position(original=True).frozen() AttributeError: 'list' object has no attribute 'get_position'

第一个错误在模块中,第二个在程序中,第三个在 make_axes 中。x、y 和 z 的值都是来自 numpy 数组的列表。figname 是一个字符串,units 也是一个字符串,而 efficiency_or_not 是一个布尔值。

def plot_that_2(x_vals, y_vals, z_1_vals, z_2_vals, z_3_vals, figname, units, efficiency_or_not):
    UI = [uniformity_calc(z_1_vals), uniformity_calc(z_2_vals), uniformity_calc(z_3_vals)]
    ranges = [ str(int(np.max(z_1_vals) - np.min(z_1_vals))), str(int(np.max(z_2_vals) - np.min(z_2_vals))), str(int(np.max(z_3_vals) - np.min(z_3_vals)))]
    z_vals = [z_1_vals, z_2_vals, z_3_vals]
    fig, axes = plt.subplots(nrows = 1, ncols = 3, sharex = True, sharey = True)

    for ax, z_val, unif, rangenum in zip(axes.flat, z_vals, UI, ranges):
    plot = plt.scatter(x_vals, y_vals, s = 5.5 * max(x_vals), c = z_val, cmap = 'rainbow')
        if efficiency_or_not:
            plot.vmin = 0
            plot.vmax = 1
            plot.xlabel = 'Uniformity: ' + unif
        else:
            plot.xlabel = 'Uniformity: ' + unif + '   ' + rangenum + ' ppm'

    cax, kw = mpl.colorbar.make_axes([ax for ax in axes.flat])
    plt.colorbar(plot, cax = cax, **kw)    
    plt.savefig('./'+ figname + '.jpg', dpi = 100)
    plt.close()

1 个回答

2

要把颜色条移动到底部,你只需要加上 orientation="horizontal" 或者 location='bottom'。下面是用户 user1442911 的例子:

fig, axes = plt.subplots(nrows=1, ncols=3)

for ax in axes.flat:
    im = ax.imshow(np.random.random((10,10)), vmin=0, vmax=1)

cax, kw = mpl.colorbar.make_axes([ax for ax in axes.flat], location='bottom')
plt.colorbar(im, cax=cax, **kw)

plt.show()

enter image description here

撰写回答