在matplotlib

时间:2015-09-27 12:39:53

标签: python matplotlib

我已经编写了一些代码来在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(),子图轴的重叠也会更糟。显然,当试图提高质量时,这没有用。这里发生了什么,我怎样才能改变数字质量并保持数字的外观不变?当我调整子图参数,添加颜色条和图例等时,是否有一个解决方案也可以工作?提前感谢您提供任何帮助。

1 个答案:

答案 0 :(得分:4)

您的问题是您显示它然后将其保存在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)

如果你想展示它,你可以在scrpit的末尾添加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()