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)

我不太明白这个问题。但我可以说的是,当以英寸为单位的数字大小和dpi都应该固定时,您需要更改您认为“太大”的对象的大小,即设置字体大小、线宽、记号等更小。通常,您只需固定dpi或以英寸为单位的大小即可获得所需的图形。@ImportanceOfBeingErnest我创建了一张具有所需尺寸的图片,并且文件大小在所需范围内。然而,绘制的图形被证明太过缩放。阅读其他线程时,似乎存在缩放和纵横比问题。您关于声明每个元素大小的建议听起来很不寻常,因为我认为应该有一种方法可以根据之前设置的figsize()和dpi参数自动调整画布中的所有元素。让我再试一次:例如,如果像素尺寸为
1200 X 600
,您通常会创建一个尺寸为
(12 x 6)
英寸和100 dpi的图形,在这种情况下,线条的尺寸可能足够大。使用400的dpi会使图中的每个点变大4倍。显然那不是你想要的。但如果需要,可以缩小图元的比例(例如,使用0.25而不是1制作线条)。(这里没有缩放或方面的问题,这就是它的工作原理和预期。)看看你提到的评论,这是关于完全不同的东西;它告诉你们,即使你们使用一个正方形的图形,你们也不会得到一个正方形的轴。这和你们这里的问题完全无关。我想我明白你们的意思了。我对dpi和figsize(x,y)之间关系的理解与您所解释的略有不同。根据你的评论,我已经测试了你的建议,看起来很有希望。也许我应该更改问题的标题…“Matplotlib图形使用72英寸的每英寸点数(ppi)”-您从哪里找到的?我到处都找不到这个。我唯一能找到的就是默认的DPI是100。@LoneLearner是的,在文档中只有一个非常隐藏的参考。当然,代码中到处都是,例如…@A.Hendry dpi表示每英寸的点(像素)。如果你把dpi加倍,你就把点加倍。一条1像素宽的线就会有两个像素宽。假设你有一条1点宽的线。它将是1点/ppi*dpi=1/72 ppi*72 dpi=1像素。现在将dpi增加一倍,因此1点/ppi*dpi=1/72 ppi*144 dpi=2像素。@importanceofbeinger非常感谢您的解释。那么,为什么图形在dpi较高的情况下会在左侧变大?它们不是都应该是2in x 2in吗?@ImportanceOfBeingErnest关于在保持文本和行大小不变的情况下增加DPI的建议?你可以浏览每一个设置,但是有很多设置需要更改。。