具有多个绘图的单个水平色条

2024-06-01 13:24:30 发布

您现在位置:Python中文网/ 问答频道 /正文

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

目标:一个大的绘图,右边有四个小的绘图,底部有一个彩色条

我对完全不同的解决方案持开放态度。我试过GridSpec和子图等等。这只是我拥有的最接近的解决方案之一,它是从matplotlib examples改编而来的

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

  • Colorbar与两个外部绘图一样宽(一段时间以来,我一直在使用bogatron's answer的变体,但我无法在这里使用),这确实是最大的困难。我见过像philn's这样的答案,它完美地说明了如何在多个图(大小相同)上垂直绘制一个图,但我找不到任何显示类似情况的合适颜色条的答案
  • 非常重要:最终保存的绘图具有给定的“精确”宽度(如果您有一个通用的解决方案,这很好,但不是必需的)。尽管设置了宽度,但在本例中,结果是~5.8”(这足够接近了)。我很少关心这个数字有多高
  • Scientific notation displayed on all colorbar labels
  • 如果顶部的图的顶部与主图的顶部对齐,并且底部也对齐,那么减少空白就更好了。我尝试过对wspace进行各种调整,但没有真正成功
  • 最后,如果有一个答案,不管我是否打开或关闭了x记号,都能起作用,那就太好了

我已经尝试使用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)

Corrected Version

或者用一种不同的方式来想象实现基本相同的目标。 another


Tags: gsadd绘图datatitlefigcolorcmap
1条回答
网友
1楼 · 发布于 2024-06-01 13:24:30

你所要求的是一些无法自动实现的事情

相反,如果使用aspect='auto',您将得到您想要的结果,只是轴的纵横比不相等。但其他受约束的_布局适用于轴可以绘制的区域,而不是轴实际绘制的区域

当然,您可以做一些数学运算,并手动完成此特定布局。但一般来说,你所要求的几乎是不可能做到的

相关问题 更多 >