dpi与数字大小之间的关系

时间:2017-12-04 12:35:52

标签: matplotlib plot graph visualization

我使用matplotlib创建了一个图,但我已经意识到绘图轴和绘制的线被缩小了。 enter image description here

阅读此earlier discussion thread,它解释了如何设置数字大小。

fig, ax = plt.subplots()

fig.set_size_inches(3, 1.5)

plt.savefig(file.jpeg, edgecolor='black', dpi=400, facecolor='black', transparent=True)

使用上面的代码(为简洁起见,删除了其他配置),我得到的结果图像文件具有1200 X 600所需的尺寸(我们应该说分辨率吗?)和所需的文件大小。

投影图像以不寻常的方式缩小,例如注释被放大。虽然我可以在轴上设置标签的大小,但由于底部和右侧脊柱很大,因此绘制的线条也是如此,因此数字看起来与比例尺不成比例。

因此,问题是,哪些配置出错?

1 个答案:

答案 0 :(得分:47)

图形尺寸(6.4, 4.8))确定图形的大小(以英寸为单位)。这给出了轴(和其他元素)在图中的空间量。 matplotlib 2中的默认图形大小为figsize=(w,h)英寸。较大的图形大小将允许显示更长的文本,更多的轴或更多的标记标记。

每英寸点数(dpi)确定数字包含的像素数。 matplotlib中的默认dpi为100. px, py = w*dpi, h*dpi # pixels # e.g. # 6.4 inches * 100 dpi = 640 pixels 的数字为

(1200,600)

因此,为了获得像素大小为例如1的图形。 figsize=(15,7.5), dpi= 80 figsize=(12,6) , dpi=100 figsize=( 8,4) , dpi=150 figsize=( 6,3) , dpi=200 etc. 您可以选​​择数字大小和dpi的几种组合,例如

import matplotlib.pyplot as plt
%matplotlib inline

def plot(fs,dpi):
    fig, ax=plt.subplots(figsize=fs, dpi=dpi)
    ax.set_title("Figsize: {}, dpi: {}".format(fs,dpi))
    ax.plot([2,4,1,5], label="Label")
    ax.legend()

figsize=(2,2)
for i in range(1,4):
    plot(figsize, i*72)

dpi=72
for i in [2,4,6]:
    plot((i,i), dpi)

现在,有什么区别?这取决于图中元素的大小。线条,标记,文本等大多数元素都有以磅为单位的大小 Matplotlib数据使用每英寸点数(ppi)为72.厚度为1磅的线将为1./72。英寸宽。使用fontsize 12点的文本将是12./72。寸高。

当然,如果您以英寸为单位更改数字大小,则点数不会更改,因此以英寸为单位的较大数字仍然具有相同的元素大小。 因此改变图形尺寸就像拿一张不同尺寸的纸张一样。这样做当然不会改变用同一支笔绘制的线条的宽度。

另一方面,更改dpi会缩放这些元素。在72 dpi时,1点大小的线是一个像素强。在144 dpi时,这条线强2像素。 因此,较大的dpi会像放大镜一样。所有元素都通过镜头的放大倍数进行缩放。

左图中的图像显示了恒定图形尺寸和变化dpi的比较。在右侧,您可以看到恒定的dpi和不同的图形大小。每行中的数字具有相同的像素大小。

enter image description here

重现的代码:

- (void) traitCollectionDidChange: (UITraitCollection *) previousTraitCollection {
    [super traitCollectionDidChange: previousTraitCollection];
    NSLog(@"current trait collection: %@",self.traitCollection);
    NSLog(@"previous trait collection: %@", previousTraitCollection);
}