python - 具有多个绘图的单个水平颜色条
问题描述
好的,我已经为此工作了几天,尽管在这里和其他地方进行了许多搜索并尝试了各种方法,但我还没有找到任何能够满足我所希望的一切的解决方案。
目标:一个大地块,右侧有四个较小的地块,底部有一个颜色条。
我对甚至完全不同的解决方案持开放态度。我已经尝试过 gridspecs 和 subplots 等等。这只是我拥有的最接近的解决方案之一,它已改编自matplotlib 示例。
对我来说很重要但在当前状态下仍未发生的事情:
- Colorbar 与两个外部地块一样宽(一段时间以来,我一直在使用bogatron 答案的变体,但我无法在这里工作),这确实是最大的难题。我已经看到了诸如philn's 之类的答案,它精美地说明了如何在多个地块(相同大小)上垂直地做一个,但我找不到任何显示与此类似情况的合适颜色条的答案。
- 非常重要:最终保存的绘图具有给定的“精确”宽度(如果您有一个很好但没有必要的通用解决方案)。尽管设置了宽度,但在这种情况下,结果是 ~5.8"(足够接近)。我不太关心这个数字有多高。
科学记数法显示在所有颜色条标签上- 较少的空白仍然会很好,顶部图的顶部与主图的顶部对齐,底部也是如此。我尝试了各种调整
wspace
,但没有真正成功。 - 最后,无论我是否打开或关闭 x-ticks,有一个有效的答案会很好。
我尝试使用 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)
解决方案
您正在要求一些无法自动完成的事情。
相反,如果你使用 aspect='auto' 你会得到你想要的,除了轴不会有相等的纵横比。但否则 constrained_layout 适用于可以绘制轴的区域,而不是实际绘制轴的区域。
您当然可以做一些数学运算并手动执行此特定布局。但是你所问的一般来说几乎是不可能的。
推荐阅读
- python - 如何使用 re.split 在 python 中拆分两列从 CSV 中查找字符串值
- linux - 不使用 sudo 重启 nginx 服务
- typescript - 打字稿角度中的参数化导入
- .net - .NET 正确任务使用
- r - 轴刻度标签不会显示在 ggplot facet
- apache-flink - 关于具有动态(自我进化)键控状态的有效检查点
- python - 如何仅计算适用条件的字段的平均值?
- python - 如何将 2 个未对齐的 Pandas 系列相乘并接收具有多索引的产品系列
- java - liquibase preConditions 的最佳实践
- sql - Postgresql-Insert 值出现非空冲突