Matplotlib 图形尺寸调整:全面指南与实用技巧
参考:how to change matplotlib figure size
Matplotlib 是 Python 中最流行的数据可视化库之一,它提供了丰富的功能来创建各种类型的图表和绘图。在使用 Matplotlib 时,控制图形尺寸是一个重要的方面,因为它直接影响到图表的视觉效果和可读性。本文将详细介绍如何在 Matplotlib 中调整图形尺寸,包括各种方法、技巧和最佳实践。
1. 基本概念
在深入探讨如何调整 Matplotlib 图形尺寸之前,我们需要了解一些基本概念:
1.1 Figure 和 Axes
- Figure:整个图形窗口
- Axes:图形中的绘图区域
1.2 尺寸单位
Matplotlib 中的尺寸通常以英寸为单位。1 英寸约等于 2.54 厘米。
1.3 DPI(每英寸点数)
DPI 决定了图形的分辨率。较高的 DPI 值会产生更高质量的图像,但文件大小也会增加。
2. 使用 figure() 函数设置图形尺寸
最直接的方法是在创建图形时使用 figure()
函数指定尺寸。
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 6))
plt.plot([1, 2, 3, 4], [1, 4, 2, 3])
plt.title('How to change matplotlib figure size - how2matplotlib.com')
plt.show()
Output:
在这个例子中,我们创建了一个宽 10 英寸、高 6 英寸的图形。figsize
参数接受一个元组,其中第一个值是宽度,第二个值是高度。
3. 使用 rcParams 全局设置图形尺寸
如果你想为所有图形设置默认尺寸,可以使用 rcParams
。
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['figure.figsize'] = [8.0, 6.0]
mpl.rcParams['figure.dpi'] = 80
plt.plot([1, 2, 3, 4], [1, 4, 2, 3])
plt.title('Global figure size setting - how2matplotlib.com')
plt.show()
Output:
这段代码设置了默认的图形尺寸为 8×6 英寸,DPI 为 80。这些设置将应用于之后创建的所有图形。
4. 调整子图尺寸
当你使用子图时,可以通过 subplots()
函数来设置整个图形的尺寸。
import matplotlib.pyplot as plt
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
ax1.plot([1, 2, 3, 4], [1, 4, 2, 3])
ax2.plot([1, 2, 3, 4], [3, 2, 4, 1])
fig.suptitle('Subplots with custom size - how2matplotlib.com')
plt.show()
Output:
这个例子创建了一个包含两个子图的图形,总尺寸为 12×5 英寸。
5. 使用 tight_layout() 自动调整布局
tight_layout()
函数可以自动调整子图参数,以给定的填充适应图形区域。
import matplotlib.pyplot as plt
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(8, 8))
ax1.plot([1, 2, 3, 4], [1, 4, 2, 3])
ax2.plot([1, 2, 3, 4], [3, 2, 4, 1])
fig.suptitle('Tight layout example - how2matplotlib.com')
plt.tight_layout()
plt.show()
Output:
tight_layout()
会自动调整子图之间的间距,以及子图与图形边缘的距离,使整体布局更加紧凑和美观。
6. 调整图形尺寸和 DPI
你可以同时设置图形尺寸和 DPI 来控制输出图像的质量和大小。
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 6), dpi=300)
plt.plot([1, 2, 3, 4], [1, 4, 2, 3])
plt.title('High resolution figure - how2matplotlib.com')
plt.show()
Output:
这个例子创建了一个高分辨率的图形,尺寸为 10×6 英寸,DPI 为 300。
7. 使用 set_size_inches() 方法动态调整尺寸
有时你可能需要在创建图形后动态调整其尺寸。这可以通过 set_size_inches()
方法实现。
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot([1, 2, 3, 4], [1, 4, 2, 3])
fig.set_size_inches(10, 6)
plt.title('Dynamically resized figure - how2matplotlib.com')
plt.show()
Output:
这个方法允许你在绘图过程中随时调整图形尺寸。
8. 保存特定尺寸的图形
当保存图形时,你可以指定输出文件的尺寸和 DPI。
import matplotlib.pyplot as plt
plt.figure(figsize=(8, 6))
plt.plot([1, 2, 3, 4], [1, 4, 2, 3])
plt.title('Saved figure with custom size - how2matplotlib.com')
plt.savefig('custom_size_figure.png', dpi=300, bbox_inches='tight')
bbox_inches='tight'
参数确保图形的所有部分都包含在保存的文件中,不会被裁剪。
9. 使用英寸以外的单位
虽然 Matplotlib 默认使用英寸,但你可以使用其他单位,如厘米。
import matplotlib.pyplot as plt
cm = 1/2.54 # 将厘米转换为英寸
plt.figure(figsize=(20*cm, 15*cm))
plt.plot([1, 2, 3, 4], [1, 4, 2, 3])
plt.title('Figure size in centimeters - how2matplotlib.com')
plt.show()
Output:
这个例子创建了一个 20×15 厘米的图形。
10. 调整子图之间的间距
使用 subplots_adjust()
函数可以精细控制子图之间的间距。
import matplotlib.pyplot as plt
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 5))
ax1.plot([1, 2, 3, 4], [1, 4, 2, 3])
ax2.plot([1, 2, 3, 4], [3, 2, 4, 1])
plt.subplots_adjust(wspace=0.5, hspace=0.5)
fig.suptitle('Adjusted subplot spacing - how2matplotlib.com')
plt.show()
Output:
wspace
控制宽度方向的间距,hspace
控制高度方向的间距。
11. 使用 GridSpec 进行复杂布局
对于更复杂的布局,可以使用 GridSpec
。
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
fig = plt.figure(figsize=(12, 8))
gs = gridspec.GridSpec(2, 2)
ax1 = fig.add_subplot(gs[0, 0])
ax2 = fig.add_subplot(gs[0, 1])
ax3 = fig.add_subplot(gs[1, :])
ax1.plot([1, 2, 3], [4, 5, 6])
ax2.plot([1, 2, 3], [6, 5, 4])
ax3.plot([1, 2, 3, 4], [1, 4, 2, 3])
fig.suptitle('Complex layout with GridSpec - how2matplotlib.com')
plt.tight_layout()
plt.show()
Output:
这个例子创建了一个 2×2 的网格,其中底部的子图跨越了两列。
12. 调整图形边距
你可以使用 subplots_adjust()
函数来调整图形的边距。
import matplotlib.pyplot as plt
plt.figure(figsize=(8, 6))
plt.plot([1, 2, 3, 4], [1, 4, 2, 3])
plt.title('Adjusted figure margins - how2matplotlib.com')
plt.subplots_adjust(left=0.2, right=0.9, top=0.9, bottom=0.2)
plt.show()
Output:
这个例子增加了图形的左右和上下边距。
13. 创建不同纵横比的图形
有时你可能需要创建特定纵横比的图形。
import matplotlib.pyplot as plt
aspect_ratio = 16/9
fig_width = 10
fig_height = fig_width / aspect_ratio
plt.figure(figsize=(fig_width, fig_height))
plt.plot([1, 2, 3, 4], [1, 4, 2, 3])
plt.title('16:9 aspect ratio figure - how2matplotlib.com')
plt.show()
Output:
这个例子创建了一个 16:9 纵横比的图形。
14. 使用 constrained_layout
constrained_layout
是一个更高级的自动布局调整工具,可以处理复杂的布局情况。
import matplotlib.pyplot as plt
fig, axs = plt.subplots(2, 2, figsize=(10, 10), constrained_layout=True)
for ax in axs.flat:
ax.plot([1, 2, 3, 4], [1, 4, 2, 3])
fig.suptitle('Constrained layout example - how2matplotlib.com')
plt.show()
Output:
constrained_layout=True
参数会自动调整子图之间的间距和边距。
15. 根据内容自动调整图形尺寸
有时,你可能想根据图形内容自动调整尺寸。这可以通过先创建图形,然后调整其大小来实现。
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot([1, 2, 3, 4], [1, 4, 2, 3])
ax.set_title('Auto-sized figure based on content - how2matplotlib.com')
# 获取当前轴的边界框
bbox = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
width, height = bbox.width, bbox.height
# 设置图形大小,增加一些边距
fig.set_size_inches(width*1.2, height*1.2)
plt.show()
Output:
这个例子首先创建图形,然后根据内容调整其大小,并添加一些额外的边距。
结论
调整 Matplotlib 图形尺寸是创建高质量可视化的重要步骤。通过本文介绍的各种方法和技巧,你可以精确控制图形的大小、比例和布局,以满足不同的需求。无论是简单的单图还是复杂的多子图布局,合适的尺寸设置都能显著提升图表的可读性和美观度。
记住,图形尺寸的选择应该根据具体的使用场景来决定。例如,用于演示的图形可能需要更大的尺寸和更高的 DPI,而用于科学论文的图形则可能需要遵循特定的格式要求。通过灵活运用本文中的技巧,你可以为各种场景创建出最适合的图形。
最后,不要忘记实践是掌握这些技巧的最好方法。尝试不同的设置,观察效果,并根据需要进行调整。随着经验的积累,你将能够更加自如地控制 Matplotlib 图形的各个方面,创造出既美观又有效的数据可视化作品。