【问题标题】:Adjusting figure quality in matplotlib在 matplotlib 中调整图形质量
【发布时间】:2015-09-28 05:51:29
【问题描述】:

我已经编写了一些代码来在 matplotlib 中生成一个多面板图形。为了使图形在文档中使用时看起来更清晰,我尝试增加 dpi。不过,我发现这也改变了图形、字体、线条等的大小,如下面的简单示例所示:

#First normal figure
fig, axarr = plt.subplots(2,2, figsize=(6,6))
for i,ax in enumerate(axarr.flatten()):
    ax.plot(range(10))
    ax.set_title('title'+str(i), fontsize=10)
    ax.set_xlabel('x'+str(i), fontsize=10)
    ax.set_ylabel('y'+str(i), fontsize=10)
plt.tight_layout()

#Again, with higher dpi
fig, axarr = plt.subplots(2,2, figsize=(6,6), dpi=200)
for i,ax in enumerate(axarr.flatten()):
    ax.plot(range(10))
    ax.set_title('title'+str(i), fontsize=10)
    ax.set_xlabel('x'+str(i), fontsize=10)
    ax.set_ylabel('y'+str(i), fontsize=10)

plt.tight_layout()
plt.show()

在我的电脑上(使用matplotlib 1.4.3),第二个图比较大,文字也比较大,所以y轴标签重叠。如果不使用 plt.tight_layout(),子图轴的重叠也更糟。显然,这在尝试制作更高质量的人物时没有帮助。这是怎么回事,我怎样才能改变图形质量并保持图形外观不变?当我调整子图参数、添加颜色条和图例等(即一般情况下)时,是否有一种解决方案也可以工作?提前感谢您提供的任何帮助。

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    您的问题是您显示它,然后将其保存在 GUI 窗口中。您必须从定义 dpi 的命令 savefig 保存图像。

    类似这样的:

    import matplotlib.pyplot as plt
    
    #First normal figure
    fig, axarr = plt.subplots(2,2, figsize=(6,6))
    for i,ax in enumerate(axarr.flatten()):
        ax.plot(range(10))
        ax.set_title('title'+str(i), fontsize=10)
        ax.set_xlabel('x'+str(i), fontsize=10)
        ax.set_ylabel('y'+str(i), fontsize=10)
    plt.tight_layout()
    plt.savefig('myfigure_100.png', dpi=100)
    plt.savefig('myfigure_200.png', dpi=200)
    

    如果要显示,可以在脚本末尾添加plt.show()

    编辑

    图形大小的dpi与字体大小的关系如下例所示:

    import matplotlib.pyplot as plt
    
    #First normal figure
    fig1, axarr1 = plt.subplots(2,2, figsize=(6,6), dpi=100)
    for i,ax in enumerate(axarr1.flatten()):
        ax.plot(range(10))
        ax.set_title('title'+str(i), fontsize=10)
        ax.set_xlabel('x'+str(i), fontsize=10)
        ax.set_ylabel('y'+str(i), fontsize=10)
    plt.tight_layout()
    
    fig2, axarr2 = plt.subplots(2,2, figsize=(12,12), dpi=50)
    for i,ax in enumerate(axarr2.flatten()):
        ax.plot(range(10))
        ax.set_title('title'+str(i), fontsize=20)
        ax.set_xlabel('x'+str(i), fontsize=20)
        ax.set_ylabel('y'+str(i), fontsize=20)
    plt.tight_layout()
    
    plt.show()
    

    【讨论】:

    • 谢谢。我的意思是,如果可能的话,我宁愿不使用 savefig 来执行此操作,因为我使用具有不同参数调用的相同脚本来生成大量数字,并且需要为脚本之外的每个数字调用 savefig (因为我使用的文件名不容易“可编程”),而且我发现如果我这样做,我很容易最终会犯错误,比如将错误的数字保存到文件中。如果将来我必须做类似的事情,我可能还会忘记设置 dpi。不使用 savefig 有没有办法做到这一点?
    • 我也很想了解为什么更改 dpi 会改变 GUI 窗口中的绘图外观,如果有人知道的话。
    • 如果您的名称不容易编程,请列出并传递相应的参数作为保存图像的文件名。关于第二条评论,我已经编辑了我的评论来解释为什么改变 dpi 的外观可以是一样的。 dpi 表示“每英寸点数”,fontsize 是数字/字母的点数。因此,取决于您如何选择它们,结果可能是相同的。
    • 谢谢。我可以看到为什么如果有很多图形元素需要调整,为什么在 savefig 中更改 dpi 会更直接,所以我会这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2010-11-12
    • 2018-07-31
    • 1970-01-01
    相关资源
    最近更新 更多