Matplotlib 图形尺寸调整:全面指南与实用技巧

Matplotlib 图形尺寸调整:全面指南与实用技巧

参考:How to change the size of figures drawn with matplotlib

Matplotlib 是 Python 中最流行的数据可视化库之一,它提供了丰富的功能来创建各种类型的图表和图形。在使用 Matplotlib 时,控制图形尺寸是一个重要的方面,因为它直接影响图形的清晰度、可读性和整体呈现效果。本文将详细介绍如何在 Matplotlib 中更改图形尺寸,包括各种方法、技巧和最佳实践。

1. 基本概念:图形和轴

在深入探讨如何更改图形尺寸之前,我们需要理解 Matplotlib 中的两个基本概念:图形(Figure)和轴(Axes)。

  • 图形(Figure):是整个绘图区域,可以包含一个或多个子图。
  • 轴(Axes):是实际绘制数据的区域,通常包含在图形中。

了解这两个概念对于正确调整图形尺寸至关重要。

2. 使用 plt.figure() 设置图形尺寸

最直接的设置图形尺寸的方法是使用 plt.figure() 函数。这个函数允许我们在创建新图形时指定其尺寸。

import matplotlib.pyplot as plt
import numpy as np

# 创建一个 8x6 英寸的图形
plt.figure(figsize=(8, 6))

x = np.linspace(0, 10, 100)
y = np.sin(x)

plt.plot(x, y)
plt.title('Sine Wave - how2matplotlib.com')
plt.xlabel('X axis')
plt.ylabel('Y axis')
plt.show()

Output:

Matplotlib 图形尺寸调整:全面指南与实用技巧

在这个例子中,我们创建了一个 8 英寸宽、6 英寸高的图形。figsize 参数接受一个元组,其中第一个值是宽度,第二个值是高度,单位是英寸。

3. 使用 plt.subplots() 设置图形尺寸

plt.subplots() 函数不仅可以创建子图,还可以同时设置整个图形的尺寸。

import matplotlib.pyplot as plt
import numpy as np

# 创建一个 10x5 英寸的图形,包含 1 行 2 列的子图
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 5))

x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)

ax1.plot(x, y1)
ax1.set_title('Sine Wave - how2matplotlib.com')

ax2.plot(x, y2)
ax2.set_title('Cosine Wave - how2matplotlib.com')

plt.tight_layout()
plt.show()

Output:

Matplotlib 图形尺寸调整:全面指南与实用技巧

这个例子创建了一个 10 英寸宽、5 英寸高的图形,包含两个并排的子图。figsize 参数的使用方式与 plt.figure() 相同。

4. 调整现有图形的尺寸

有时,我们可能需要在创建图形后调整其尺寸。这可以通过 fig.set_size_inches() 方法实现。

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()

x = np.linspace(0, 10, 100)
y = np.exp(-x/10) * np.sin(x)

ax.plot(x, y)
ax.set_title('Damped Sine Wave - how2matplotlib.com')

# 调整图形尺寸为 12x4 英寸
fig.set_size_inches(12, 4)

plt.show()

Output:

Matplotlib 图形尺寸调整:全面指南与实用技巧

这个例子首先创建了一个默认尺寸的图形,然后使用 set_size_inches() 方法将其调整为 12 英寸宽、4 英寸高。

5. 使用 rcParams 全局设置图形尺寸

如果你想为所有图形设置一个默认尺寸,可以使用 Matplotlib 的 rcParams

import matplotlib.pyplot as plt
import numpy as np

# 全局设置图形尺寸为 10x6 英寸
plt.rcParams['figure.figsize'] = [10, 6]

x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x) * np.exp(-x/10)

plt.plot(x, y)
plt.title('Decaying Sine Wave - how2matplotlib.com')
plt.xlabel('X axis')
plt.ylabel('Y axis')
plt.show()

Output:

Matplotlib 图形尺寸调整:全面指南与实用技巧

这个设置会影响之后创建的所有图形,除非在创建特定图形时明确指定了不同的尺寸。

6. 调整 DPI(每英寸点数)

图形的实际像素尺寸不仅取决于英寸尺寸,还取决于 DPI(Dots Per Inch,每英寸点数)设置。调整 DPI 可以在不改变图形物理尺寸的情况下改变其分辨率。

import matplotlib.pyplot as plt
import numpy as np

# 创建一个 6x4 英寸、300 DPI 的图形
plt.figure(figsize=(6, 4), dpi=300)

x = np.linspace(0, 10, 1000)
y = np.sin(x) * np.cos(x)

plt.plot(x, y)
plt.title('Sin(x) * Cos(x) - how2matplotlib.com')
plt.xlabel('X axis')
plt.ylabel('Y axis')
plt.show()

Output:

Matplotlib 图形尺寸调整:全面指南与实用技巧

这个例子创建了一个 6×4 英寸、300 DPI 的图形。增加 DPI 会使图形在屏幕上看起来更大,并在保存时产生更高分辨率的图像。

7. 使用 bbox_inches 参数调整保存图形的尺寸

当保存图形时,我们可能希望裁剪掉多余的空白区域。这可以通过 bbox_inches 参数实现。

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(figsize=(8, 6))

x = np.linspace(0, 10, 100)
y = np.sin(x) * np.exp(-x/5)

ax.plot(x, y)
ax.set_title('Damped Sine Wave - how2matplotlib.com')
ax.set_xlabel('X axis')
ax.set_ylabel('Y axis')

# 保存图形,裁剪掉多余的空白区域
plt.savefig('damped_sine_wave_how2matplotlib.png', bbox_inches='tight')
plt.show()

Output:

Matplotlib 图形尺寸调整:全面指南与实用技巧

bbox_inches='tight' 参数会自动裁剪图形,只保留包含实际内容的部分。

8. 调整子图之间的间距

当创建多个子图时,调整它们之间的间距可以优化整体布局。

import matplotlib.pyplot as plt
import numpy as np

fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(8, 8))

x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)

ax1.plot(x, y1)
ax1.set_title('Sine Wave - how2matplotlib.com')

ax2.plot(x, y2)
ax2.set_title('Cosine Wave - how2matplotlib.com')

# 调整子图之间的间距
plt.subplots_adjust(hspace=0.4)

plt.show()

Output:

Matplotlib 图形尺寸调整:全面指南与实用技巧

plt.subplots_adjust() 函数允许我们精细调整子图之间的间距。hspace 参数控制垂直方向的间距。

9. 使用 GridSpec 创建复杂布局

对于更复杂的布局,我们可以使用 GridSpec。这允许我们创建不规则的子图布局,并精确控制每个子图的大小。

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import numpy as np

fig = plt.figure(figsize=(12, 8))
gs = gridspec.GridSpec(2, 2, width_ratios=[2, 1], height_ratios=[1, 2])

ax1 = fig.add_subplot(gs[0, 0])
ax2 = fig.add_subplot(gs[0, 1])
ax3 = fig.add_subplot(gs[1, :])

x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.tan(x)

ax1.plot(x, y1)
ax1.set_title('Sine - how2matplotlib.com')

ax2.plot(x, y2)
ax2.set_title('Cosine - how2matplotlib.com')

ax3.plot(x, y3)
ax3.set_title('Tangent - how2matplotlib.com')

plt.tight_layout()
plt.show()

Output:

Matplotlib 图形尺寸调整:全面指南与实用技巧

这个例子创建了一个 2×2 的网格,但右上角的子图比左上角的小,底部的子图跨越整个宽度。

10. 自适应图形尺寸

有时,我们可能需要根据数据或其他条件动态调整图形尺寸。这可以通过编程方式实现。

import matplotlib.pyplot as plt
import numpy as np

def create_plot(data_length):
    # 根据数据长度调整图形宽度
    width = max(6, data_length / 20)
    fig, ax = plt.subplots(figsize=(width, 6))

    x = np.linspace(0, data_length, data_length)
    y = np.sin(x / 10) * np.exp(-x / 100)

    ax.plot(x, y)
    ax.set_title(f'Adaptive Plot ({data_length} points) - how2matplotlib.com')
    ax.set_xlabel('X axis')
    ax.set_ylabel('Y axis')

    plt.show()

# 测试不同数据长度
create_plot(100)
create_plot(500)

这个函数根据数据点的数量动态调整图形的宽度,确保无论数据量如何,图形都能保持良好的可读性。

11. 使用 constrained_layout 自动调整布局

constrained_layout 是 Matplotlib 提供的一个强大工具,可以自动调整图形元素的位置,以避免重叠并优化空间利用。

import matplotlib.pyplot as plt
import numpy as np

fig, axs = plt.subplots(2, 2, figsize=(10, 8), constrained_layout=True)

x = np.linspace(0, 10, 100)

axs[0, 0].plot(x, np.sin(x))
axs[0, 0].set_title('Sine - how2matplotlib.com')

axs[0, 1].plot(x, np.cos(x))
axs[0, 1].set_title('Cosine - how2matplotlib.com')

axs[1, 0].plot(x, np.tan(x))
axs[1, 0].set_title('Tangent - how2matplotlib.com')

axs[1, 1].plot(x, np.exp(x))
axs[1, 1].set_title('Exponential - how2matplotlib.com')

plt.show()

Output:

Matplotlib 图形尺寸调整:全面指南与实用技巧

使用 constrained_layout=True 可以自动调整子图之间的间距和标题位置,无需手动设置 subplots_adjust

12. 调整图形边距

有时我们可能需要精确控制图形的边距。这可以通过 fig.subplots_adjust() 方法实现。

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(figsize=(8, 6))

x = np.linspace(0, 10, 100)
y = np.sin(x) * np.exp(-x/10)

ax.plot(x, y)
ax.set_title('Custom Margins - how2matplotlib.com')
ax.set_xlabel('X axis')
ax.set_ylabel('Y axis')

# 调整图形边距
fig.subplots_adjust(left=0.15, right=0.95, top=0.9, bottom=0.15)

plt.show()

Output:

Matplotlib 图形尺寸调整:全面指南与实用技巧

这个例子展示了如何精确控制图形的左、右、上、下边距。

13. 创建不同纵横比的图形

有时,我们可能需要创建特定纵横比的图形,例如正方形或宽屏格式。

import matplotlib.pyplot as plt
import numpy as np

# 创建一个正方形图形
fig, ax1 = plt.subplots(figsize=(6, 6))

x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)

ax1.plot(x, y)
ax1.set_title('Square Plot - how2matplotlib.com')
ax1.set_aspect('equal')

plt.show()

# 创建一个宽屏格式的图形
fig, ax2 = plt.subplots(figsize=(16, 9))

x = np.linspace(0, 4*np.pi, 200)
y = np.sin(x) * np.exp(-x/10)

ax2.plot(x, y)
ax2.set_title('Widescreen Plot - how2matplotlib.com')

plt.show()

这个例子展示了如何创建正方形(1:1 比例)和宽屏(16:9 比例)格式的图形。

14. 使用英寸以外的单位

虽然 Matplotlib 默认使用英寸作为尺寸单位,但我们可以使用其他单位,如厘米或毫米。

import matplotlib.pyplot as plt
import numpy as np

# 将厘米转换为英寸
cm = 1/2.54  # 1 inch = 2.54 cm

fig, ax = plt.subplots(figsize=(20*cm, 15*cm))

x = np.linspace(0, 10, 100)
y = np.sin(x) * np.cos(x)

ax.plot(x, y)
ax.set_title('Plot in Centimeters - how2matplotlib.com')
ax.set_xlabel('X axis')
ax.set_ylabel('Y axis')

plt.show()

Output:

Matplotlib 图形尺寸调整:全面指南与实用技巧

这个例子创建了一个 20 厘米宽、15 厘米高的图形。通过定义转换因子,我们可以轻松地使用厘米或其他单位来指定图形尺寸。

15. 根据屏幕分辨率调整图形尺寸

在不同的显示设备上,相同尺寸的图形可能看起来大小不一。我们可以根据屏幕分辨率动态调整图形尺寸。

import matplotlib.pyplot as plt
import numpy as np
import tkinter as tk

def get_screen_resolution():
    root = tk.Tk()
    screen_width = root.winfo_screenwidth()
    screen_height = root.winfo_screenheight()
    root.destroy()
    return screen_width, screen_height

screen_width, screen_height = get_screen_resolution()
fig_width = screen_width / 100  # 将屏幕宽度转换为合适的图形宽度
fig_height = fig_width * 0.75  # 保持 4:3 的宽高比

fig, ax = plt.subplots(figsize=(fig_width, fig_height))

x = np.linspace(0, 10, 100)
y = np.sin(x) * np.exp(-x/5)

ax.plot(x, y)
ax.set_title('Screen-Adaptive Plot - how2matplotlib.com')
ax.set_xlabel('X axis')
ax.set_ylabel('Y axis')

plt.show()

Output:

Matplotlib 图形尺寸调整:全面指南与实用技巧

这个例子首先获取屏幕分辨率,然后根据屏幕宽度计算合适的图形尺寸。这样可以确保图形在不同分辨率的屏幕上都能以合适的大小显示。

16. 使用相对尺寸

有时,我们可能希望图形的某些部分相对于整体有固定的比例。这可以通过使用相对尺寸来实现。

import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure(figsize=(10, 8))

# 主图占据 80% 的宽度和高度
main_ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])

# 右上角的小图占据 20% 的宽度和高度
inset_ax = fig.add_axes([0.65, 0.65, 0.2, 0.2])

x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)

main_ax.plot(x, y1)
main_ax.set_title('Main Plot - how2matplotlib.com')

inset_ax.plot(x, y2)
inset_ax.set_title('Inset', fontsize=8)

plt.show()

Output:

Matplotlib 图形尺寸调整:全面指南与实用技巧

在这个例子中,我们使用 fig.add_axes() 方法来添加轴。参数列表 [left, bottom, width, height] 定义了轴的位置和大小,其中所有值都是相对于整个图形的比例。

17. 动态调整图形尺寸以适应内容

有时,我们可能不知道内容会占用多少空间。在这种情况下,我们可以先创建图形,然后根据内容调整其大小。

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()

x = np.linspace(0, 10, 100)
y = np.sin(x) * np.exp(-x/10)

ax.plot(x, y)
ax.set_title('Auto-sized Plot - how2matplotlib.com')
ax.set_xlabel('X axis')
ax.set_ylabel('Y axis')

# 自动调整布局
plt.tight_layout()

# 获取当前图形的边界框
bbox = fig.get_tightbbox(fig.canvas.get_renderer())

# 根据边界框调整图形大小
fig.set_size_inches(bbox.width / fig.dpi, bbox.height / fig.dpi)

plt.show()

Output:

Matplotlib 图形尺寸调整:全面指南与实用技巧

这个例子首先创建图形并绘制内容,然后使用 tight_layout() 自动调整布局。接着,我们获取图形的紧凑边界框,并据此调整图形大小。

18. 在不同的输出格式中保持一致的尺寸

当将图形保存为不同的文件格式时,有时可能会出现尺寸不一致的情况。我们可以通过明确指定 DPI 来确保一致性。

import matplotlib.pyplot as plt
import numpy as np

def create_and_save_plot(filename, format):
    fig, ax = plt.subplots(figsize=(8, 6))

    x = np.linspace(0, 10, 100)
    y = np.sin(x) * np.cos(x)

    ax.plot(x, y)
    ax.set_title(f'Consistent Size Plot - {format} - how2matplotlib.com')
    ax.set_xlabel('X axis')
    ax.set_ylabel('Y axis')

    plt.savefig(filename, format=format, dpi=300, bbox_inches='tight')
    plt.close(fig)

# 保存为不同格式
create_and_save_plot('plot_how2matplotlib.png', 'png')
create_and_save_plot('plot_how2matplotlib.pdf', 'pdf')
create_and_save_plot('plot_how2matplotlib.svg', 'svg')

这个函数创建相同的图形并将其保存为不同的文件格式,同时保持一致的尺寸和分辨率。

19. 使用 Axes 的 set_position 方法精确定位

有时,我们可能需要非常精确地控制轴的位置和大小。这可以通过 Axes 对象的 set_position 方法实现。

import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure(figsize=(10, 8))

# 创建主轴
main_ax = fig.add_subplot(111)

x = np.linspace(0, 10, 100)
y = np.sin(x)

main_ax.plot(x, y)
main_ax.set_title('Main Plot with Inset - how2matplotlib.com')

# 创建插入轴
inset_ax = fig.add_axes([0, 0, 1, 1])
inset_ax.plot(x, np.cos(x))
inset_ax.set_title('Inset Plot')

# 精确定位插入轴
inset_ax.set_position([0.6, 0.6, 0.25, 0.25])

plt.show()

Output:

Matplotlib 图形尺寸调整:全面指南与实用技巧

在这个例子中,我们首先创建了一个占据整个图形的主轴,然后添加了一个插入轴。使用 set_position 方法,我们可以精确地控制插入轴的位置和大小。

20. 使用 aspect 参数控制轴的纵横比

在某些情况下,保持数据的正确纵横比很重要。我们可以使用 aspect 参数来控制这一点。

import matplotlib.pyplot as plt
import numpy as np

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))

x = np.linspace(0, 10, 100)
y = np.sin(x)

ax1.plot(x, y)
ax1.set_title('Default Aspect - how2matplotlib.com')
ax1.set_xlabel('X axis')
ax1.set_ylabel('Y axis')

ax2.plot(x, y)
ax2.set_title('Equal Aspect - how2matplotlib.com')
ax2.set_xlabel('X axis')
ax2.set_ylabel('Y axis')
ax2.set_aspect('equal')

plt.tight_layout()
plt.show()

Output:

Matplotlib 图形尺寸调整:全面指南与实用技巧

在这个例子中,左侧的子图使用默认的纵横比,而右侧的子图使用 aspect='equal' 设置,确保 x 轴和 y 轴的比例相同。

总结:

本文详细介绍了在 Matplotlib 中调整图形尺寸的多种方法和技巧。我们探讨了从基本的尺寸设置到高级的布局控制,包括使用 figure()subplots() 函数、调整 DPI、使用 GridSpec 创建复杂布局、动态调整图形大小等多个方面。通过这些技巧,你可以创建出既美观又信息丰富的可视化图表,无论是用于数据分析、科学研究还是商业报告。记住,图形的尺寸和布局对于有效传达信息至关重要,因此在创建图表时要仔细考虑这些因素。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程