首页 > 解决方案 > 具有多个绘图的单个水平颜色条

问题描述

好的,我已经为此工作了几天,尽管在这里和其他地方进行了许多搜索并尝试了各种方法,但我还没有找到任何能够满足我所希望的一切的解决方案。

目标:一个大地块,右侧有四个较小的地块,底部有一个颜色条。

我对甚至完全不同的解决方案持开放态度。我已经尝试过 gridspecs 和 subplots 等等。这只是我拥有的最接近的解决方案之一,它已改编自matplotlib 示例

对我来说很重要但在当前状态下仍未发生的事情:

我尝试使用 Inkscape 来说明此代码中的原始图如何以红色显示,而以绿色显示更理想的输出。

#%% Example for Stack
# Set page width
# This may be found using \usepackage{layouts} and then in the body
# textwidth = \printinunitsof{in}\prntlen{\textwidth}
textwidth = 5.90666

# Set Plot Color
color = 'cividis'

data = np.random.rand(100, 100)*1e7
AoI = [[25, 75], [25, 75]]

fig = plt.figure(constrained_layout=True)
fig.set_figwidth(textwidth)
 
gs = fig.add_gridspec(3, 4)
ax1 = fig.add_subplot(gs[0:2, 0:2])
ax1.set(title = 'No Polarization', yticks = [], #xticks = [],
       xlim = AoI[0], ylim = AoI[1],
       )
ax1.imshow(data, cmap = color)

ax2 = fig.add_subplot(gs[0, 2])
ax2.set(title = '0', yticks = [], #xticks = [],
       xlim = AoI[0], ylim = AoI[1],
       )
ax2.imshow(data, cmap = color)
ax3 = fig.add_subplot(gs[0, 3])
ax3.set(title = '45', yticks = [], #xticks = [],
       xlim = AoI[0], ylim = AoI[1],
       )
ax3.imshow(data, cmap = color)
ax4 = fig.add_subplot(gs[1, 2])
ax4.set(title = '90', yticks = [], #xticks = [],
       xlim = AoI[0], ylim = AoI[1],
       )
ax4.imshow(data, cmap = color)
ax5 = fig.add_subplot(gs[1, 3])
ax5.set(title = '135', yticks = [], #xticks = [],
       xlim = AoI[0], ylim = AoI[1],
       )
ax5.imshow(data, cmap = color)

ticks = np.array([data.min()*0.9 +data.max()*0.1,
                  np.average([data.min(),data.max()]),
                  data.max()*0.9 +data.min()*0.1]).astype(int)


def fmt(x, pos):
    a, b = '{:.2e}'.format(x).split('e')
    b = int(b)
    return r'${} \times 10^{{{}}}$'.format(a, b)

cbar = plt.colorbar(ax1.imshow(data, cmap = cmap), ax=[ax1, ax4, ax5], 
             #shrink = 0.935, #with ticks
             shrink = 0.922, #without ticks
             location = 'bottom', ticks = ticks,
             anchor = (10,10), format=ticker.FuncFormatter(fmt)
             )

fig.suptitle('d = 160 nm (p = 570 nm)')
plt.savefig(fname = 'demo.pdf',
            format = 'pdf', dpi = 600, bbox_inches = 'tight', pad_inches = 0)

修正版

或者也许是一种不同的方式来可视化实现基本相同的事情。 其他

标签: pythonmatplotlib

解决方案


您正在要求一些无法自动完成的事情。

相反,如果你使用 aspect='auto' 你会得到你想要的,除了轴不会有相等的纵横比。但否则 constrained_layout 适用于可以绘制轴区域,而不是实际绘制轴的区域。

您当然可以做一些数学运算并手动执行此特定布局。但是你所问的一般来说几乎是不可能的。


推荐阅读