Dpi 与图形大小的关系

我已经创建了一个图使用 matplotlib,但我已经实现了情节轴和绘制线得到放大。

enter image description here

阅读此 之前讨论的话题,它解释了如何设置图形大小。

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

投影图像以一种不同寻常的方式被放大,例如注释被放大。虽然我可以在轴上设置标签的大小,但是这个图看起来与比例不成正比,因为底部和右边的脊柱都很大,绘制的线也很大。

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

141857 次浏览

Figure size (figsize) determines the size of the figure in inches. This gives the amount of space the axes (and other elements) have inside the figure. The default figure size is (6.4, 4.8) inches in matplotlib 2. A larger figure size will allow for longer texts, more axes or more ticklabels to be shown.

Dots per inches (dpi) determines how many pixels the figure comprises. The default dpi in matplotlib is 100. A figure of figsize=(w,h) will have

px, py = w*dpi, h*dpi  # pixels
# e.g.
# 6.4 inches * 100 dpi = 640 pixels

So in order to obtain a figure with a pixel size of e.g. (1200,600) you may chose several combinations of figure size and dpi, e.g.

figsize=(15,7.5), dpi= 80
figsize=(12,6)  , dpi=100
figsize=( 8,4)  , dpi=150
figsize=( 6,3)  , dpi=200
etc.

Now, what is the difference? This is determined by the size of the elements inside the figure. Most elements like lines, markers, texts have a size given in points.
Matplotlib figures use Points per inch (ppi) of 72. A line with thickness 1 point will be 1./72. inch wide. A text with fontsize 12 points will be 12./72. inch heigh.

Of course if you change the figure size in inches, points will not change, so a larger figure in inches still has the same size of the elements. Changing the figure size is thus like taking a piece of paper of a different size. Doing so, would of course not change the width of the line drawn with the same pen.

On the other hand, changing the dpi scales those elements. At 72 dpi, a line of 1 point size is one pixel strong. At 144 dpi, this line is 2 pixels strong. A larger dpi will therefore act like a magnifying glass. All elements are scaled by the magnifying power of the lens.

A comparisson for constant figure size and varying dpi is shown in the image below on the left. On the right you see a constant dpi and varying figure size. Figures in each row have the same pixel size.

enter image description here

Code to reproduce:

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)