Matplotlib dpi与体形大小的关系

Matplotlib dpi与体形大小的关系,matplotlib,plot,graph,visualization,Matplotlib,Plot,Graph,Visualization,我使用matplotlib创建了一个图形,但我意识到打印轴和绘制的线被缩小了。 阅读本文,它解释了如何设置图形大小。 fig,ax=plt.subplot() fig.set\u size\u英寸(3,1.5) plt.savefig(file.jpeg,edgecolor='black',dpi=400,facecolor='black',transparent=True) 通过上面的代码(为了简洁起见删除了其他配置),我确实得到了一个带有1200 X 600所需尺寸(我们是否也应该说分

我使用matplotlib创建了一个图形,但我意识到打印轴和绘制的线被缩小了。

阅读本文,它解释了如何设置图形大小。

fig,ax=plt.subplot()

fig.set\u size\u英寸(3,1.5)

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

通过上面的代码(为了简洁起见删除了其他配置),我确实得到了一个带有
1200 X 600
所需尺寸(我们是否也应该说分辨率?)和所需文件大小的图像文件

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


因此,问题是,什么配置出了问题?

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

每英寸点数(dpi)确定图形包含多少像素。matplotlib中的默认dpi为100。
figsize=(w,h)
的图形将具有

px, py = w*dpi, h*dpi  # pixels
# e.g.
# 6.4 inches * 100 dpi = 640 pixels
因此,为了获得像素大小为例如
(1200600)
的图形,您可以选择图形大小和dpi的几种组合,例如

figsize=(15,7.5), dpi= 80
figsize=(12,6)  , dpi=100
figsize=( 8,4)  , dpi=150
figsize=( 6,3)  , dpi=200
etc.
现在,有什么区别?这取决于图形中元素的大小。大多数元素(如线条、标记、文本)的大小都以点为单位。
Matplotlib图形使用72的每英寸点数(ppi)。厚度为1点的线将为1./72。一英寸宽。字体大小为12点的文本将为12./72。英寸高

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

另一方面,更改dpi会缩放这些元素。在72 dpi时,1点大小的线的强度为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)

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

每英寸点数(dpi)确定图形包含多少像素。matplotlib中的默认dpi为100。
figsize=(w,h)
的图形将具有

px, py = w*dpi, h*dpi  # pixels
# e.g.
# 6.4 inches * 100 dpi = 640 pixels
因此,为了获得像素大小为例如
(1200600)
的图形,您可以选择图形大小和dpi的几种组合,例如

figsize=(15,7.5), dpi= 80
figsize=(12,6)  , dpi=100
figsize=( 8,4)  , dpi=150
figsize=( 6,3)  , dpi=200
etc.
现在,有什么区别?这取决于图形中元素的大小。大多数元素(如线条、标记、文本)的大小都以点为单位。
Matplotlib图形使用72的每英寸点数(ppi)。厚度为1点的线将为1./72。一英寸宽。字体大小为12点的文本将为12./72。英寸高

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

另一方面,更改dpi会缩放这些元素。在72 dpi时,1点大小的线的强度为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)

我不太明白这个问题。但我可以说的是,当以英寸为单位的数字大小和dpi都应该固定时,您需要更改您认为“太大”的对象的大小,即设置字体大小、线宽、记号等更小。通常,您只需固定dpi或以英寸为单位的大小即可获得所需的图形。@ImportanceOfBeingErnest我创建了一张具有所需尺寸的图片,并且文件大小在所需范围内。然而,绘制的图形被证明太过缩放。阅读其他线程时,似乎存在缩放和纵横比问题。您关于声明每个元素大小的建议听起来很不寻常,因为我认为应该有一种方法可以根据之前设置的figsize()和dpi参数自动调整画布中的所有元素。让我再试一次:例如,如果像素尺寸为
1200 X 600
,您通常会创建一个尺寸为
(12 x 6)
英寸和100 dpi的图形,在这种情况下,线条的尺寸可能足够大。使用400的dpi会使每个点