如何让matplotlib pyplot以特定分辨率生成视图/输出到.png的图表?

4 投票
3 回答
1598 浏览
提问于 2025-04-17 06:23

我对手动在Excel里制作图表感到厌烦,所以我想用Python来自动化这个过程,把.csv数据处理成可以用的格式,然后用matplotlib来绘制结果。

使用matplotlib生成图表没问题,但我搞不清楚怎么设置输出的比例和分辨率。

具体来说,我想生成散点图和堆叠区域图。我尝试过的所有方法似乎都导致了以下一种或多种问题:

  • 图表区域太拥挤(小的绘图区域被图例、坐标轴等占满)。
  • 比例不对。
  • 图表区域两边有很大的空白(我想要一个很宽但不太高的图像)。

如果有人能提供一些有效的例子来展示如何实现这个效果,我将非常感激!

3 个回答

0

在设置图像的清晰度时,你可以在创建图像的时候使用 dpi(每英寸点数)这个参数,或者在 savefig() 函数中使用。想要打印出高质量的图形,建议使用 dpi=600 或更高的值。

3

长宽比 / 图形大小

我发现最简单的方法是,在创建图形时,设置 figsize 参数。这个参数可以在 figure 函数中使用。比如,下面的代码会把图形设置为宽4英寸、高3英寸:

import matplotlib.pyplot as plt
fig = plt.figure(figsize=(4,3))

调整间距

为了调整间距,有一个叫做 subplots_adjust 的函数。这个函数可以让你改变图形的边界区域,从而为标题、坐标轴和标签留出更多空间。下面是我某个图形的例子:

plt.gcf().subplots_adjust(bottom=0.15, left=0.13, right=0.95, top=0.96)
5

你可以通过 ax.set_aspect 来控制图形的宽高比:

import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax=fig.add_subplot(1,1,1)
ax.set_aspect(0.3)
x,y=np.random.random((2,100))
plt.scatter(x,y)    

还有一种设置宽高比的方法(之前已经被 jterrace 提到过),就是在 plt.figure 中使用 figsize 参数,比如 fig = plt.figure(figsize=(3,1))。不过这两种方法稍微有点不同:一个图形可以包含多个坐标轴,而 figsize 控制的是整个图形的宽高比,而 set_aspect 控制的是某一个坐标轴的宽高比。

接下来,你可以用 bbox_inches='tight' 来裁剪掉图表周围的多余空白:

plt.savefig('/tmp/test.png', bbox_inches='tight')

enter image description here

如果你想去掉因为 matplotlib 自动选择的 x 轴和 y 轴范围而产生的多余空白,可以手动设置这些范围,使用 ax.set_xlimax.set_ylim

ax.set_xlim(0, 1)
ax.set_ylim(0, 1)

enter image description here

撰写回答