【发布时间】:2019-04-15 14:45:19
【问题描述】:
假设我正在尝试用x*y 像素(或英寸)绘制黑洞图片。与许多其他人不同,我不想指定总图形大小,而是指定绘图内容的大小(因此框架中的所有内容,不包括框架本身、刻度、标签、颜色条、边距......)。
最好的方法是什么?
自己的尝试
我已经遇到过几次这个问题,但我现在更喜欢其他方法,而不是我之前的试错猜测迭代大小......这是我的“操场代码”:
import numpy as np
%matplotlib inline
import matplotlib
from matplotlib import pyplot as plt
import notebook
print(matplotlib.__version__, notebook.__version__)
# 3.0.0, 5.7.0 in my case
# some data
x, y = 456, 123
a = np.random.randn(y, x)
# the following at least gets the actual figure size in browser right,
# but if possible i'd like to avoid large white space margins as well...
# %config InlineBackend.print_figure_kwargs = {'bbox_inches': None}
dpi = plt.rcParams['figure.dpi']
fig, ax = plt.subplots(figsize=(x/dpi, y/dpi), dpi=dpi)
im = ax.imshow(a, interpolation='none')
cb = fig.colorbar(im)
# print sizes
bbox = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
print(f"content size: ({bbox.width}, {bbox.height}) inch, ({bbox.width*fig.dpi}, {bbox.height*fig.dpi}) px")
print(f"fig size: {fig.get_size_inches()} in, {fig.dpi*fig.get_size_inches()} px")
print(f"dpi: {fig.dpi}")
输出:
content size: (4.023888888888889, 1.3870138888888888) inch, (289.72, 99.865) px
fig size: [6.33333333 1.70833333] in, [456. 123.] px
dpi: 72.0
如您所见,打印的图形大小为 456x123 像素,但如果您实际检查上传的图片(从浏览器粘贴的副本),您会发现它只有 376x119 像素。虽然这可以修复(如代码中所述),但与此无关的实际“内容”大小保持为 282x75 像素:-/。
有什么想法吗?
【问题讨论】:
-
遗憾的是没有首选的方法。最简单的解决方案还取决于您是否真的需要颜色条,以及您是否可以承受 1 像素的误差(即,如果瞄准 123 像素,则获得 122 像素的图像)。
-
heh, ouch ;) 是的,颜色条和准确性是需要的(重点是以准确的方式呈现科学数据,尽可能少的混叠效应来源)。如果 cbar 在另一个子图中也没关系。我也不在乎最终的图形大小(只要它不荒谬)。我已经尝试过一个太大的数字,然后把它剪下来,但无法做到这一点,我想:需要一个更简单的方法。
标签: matplotlib jupyter-notebook imshow