dpi与数字大小之间的关系

qbo*_*ang 33 plot visualization graph matplotlib

我使用matplotlib创建了一个图,但我已经意识到绘图轴和绘制的线被缩小了. 在此输入图像描述

阅读这个早期的讨论主题,它解释了如何设置数字大小.

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所需尺寸的结果图像文件(我们应该说分辨率吗?)和所需的文件大小.

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

所以问题是,我们如何解决这个问题,哪些配置出错?

Imp*_*est 65

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

每英寸点数(dpi)确定该图包含的像素数.在matplotlib默认的DPI为100的数字figsize=(w,h)将有

px, py = w*dpi, h*dpi  # pixels
# e.g.
# 6.4 inches * 100 dpi = 640 pixels
Run Code Online (Sandbox Code Playgroud)

因此,为了获得具有例如像素尺寸的图形,(1200,600)可以选择图形尺寸和dpi的几种组合,例如

figsize=(15,7.5), dpi= 80
figsize=(12,6)  , dpi=100
figsize=( 8,4)  , dpi=150
figsize=( 6,3)  , dpi=200
etc.
Run Code Online (Sandbox Code Playgroud)

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

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

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

恒定数字大小和变化dpi的比较如左下图所示.在右侧,您可以看到恒定的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)
Run Code Online (Sandbox Code Playgroud)

  • @LoneLearner是的,在[转换教程](https://matplotlib.org/tutorials/advanced/transforms_tutorial.html#using-offset-transforms-to-create-a)的文档中只有一个非常隐藏的参考-阴影效果)。当然,它遍布代码,例如[此处](https://github.com/matplotlib/matplotlib/blob/40dfc353aa66b93fd0fbc55ca1f51701202c0549/lib/matplotlib/axes/_base.py#L694)。 (7认同)
  • “Matplotlib 图形使用的每英寸点数 (ppi) 为 72” - 您从哪里找到这个?我在任何地方都找不到这个。我唯一能找到的是默认 DPI 是 100。 (3认同)
  • @A.Hendry dpi 表示每英寸的点数(像素)。如果将 dpi 加倍,点也会加倍。1 像素宽的线将是 2 像素宽。假设您有一条宽度为 1 磅的线。它将是 1 点 / ppi * dpi = 1 / 72 ppi * 72 dpi = 1 像素。现在,您将 dpi 加倍,因此 1 点 / ppi * dpi = 1 / 72 ppi * 144 dpi = 2 像素。 (2认同)
  • @ImportanceOfBeingErnest 谢谢您的解释。那么为什么随着 dpi 的增加,左侧的图形会变大呢?它们不是都应该是 2 英寸 x 2 英寸吗? (2认同)
  • @ImportanceOfBeingErnest 对于像您在这里所做的那样增加 DPI 同时保持文本和线条大小大致相同有什么建议吗?您可以检查每一个设置,但需要更改很多设置。 (2认同)