在Matplotlib中绝对方式调整单个子图的高度
参考: Adjust one subplots height in absolute way (not relative) in Matplotlib
在数据可视化的过程中,经常需要对图表的布局和尺寸进行精确的控制。Matplotlib是Python中一个非常强大的绘图库,它提供了丰富的接口来调整图表的各个方面。本文将详细介绍如何在Matplotlib中以绝对方式调整单个子图的高度,这是在进行多图布局时常见的需求。
基础概念
在Matplotlib中,一个图形通常由多个子图(subplots)组成。每个子图都是一个独立的绘图区域,具有自己的坐标系统。调整子图的大小通常涉及到两种方式:相对方式和绝对方式。相对方式指的是根据图形的总大小来调整子图的大小,而绝对方式则是直接指定子图的具体尺寸。
在进行绝对尺寸调整时,我们通常会用到Figure
对象的subplots_adjust
方法或者使用GridSpec
来精确控制布局。
示例代码
接下来,我们将通过一系列的示例代码来展示如何在Matplotlib中绝对方式调整单个子图的高度。
示例1:创建基础图形
import matplotlib.pyplot as plt
# 创建一个图形和一个子图
fig, ax = plt.subplots()
ax.text(0.5, 0.5, 'how2matplotlib.com', fontsize=12, ha='center')
plt.show()
Output:
示例2:使用subplots_adjust调整子图高度
import matplotlib.pyplot as plt
# 创建图形
fig, ax = plt.subplots()
fig.subplots_adjust(left=0.1, right=0.9, top=0.9, bottom=0.1, hspace=0.4, wspace=0.4)
# 在子图上绘制文本
ax.text(0.5, 0.5, 'how2matplotlib.com', fontsize=12, ha='center')
plt.show()
Output:
示例3:使用Figure的set_size_inches直接设置尺寸
import matplotlib.pyplot as plt
# 创建图形
fig, ax = plt.subplots()
fig.set_size_inches(8, 6) # 设置整个图形的尺寸为8x6英寸
# 在子图上绘制文本
ax.text(0.5, 0.5, 'how2matplotlib.com', fontsize=12, ha='center')
plt.show()
Output:
示例4:使用GridSpec调整子图布局
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
# 创建图形
fig = plt.figure()
gs = gridspec.GridSpec(2, 1, height_ratios=[3, 1])
# 创建两个子图
ax1 = fig.add_subplot(gs[0])
ax2 = fig.add_subplot(gs[1])
# 在子图上绘制文本
ax1.text(0.5, 0.5, 'how2matplotlib.com', fontsize=12, ha='center')
ax2.text(0.5, 0.5, 'how2matplotlib.com', fontsize=12, ha='center')
plt.show()
Output:
示例5:动态调整子图高度
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
# 创建图形和子图
fig, ax = plt.subplots()
# 动态调整子图高度
def adjust_height(new_height):
fig.set_size_inches(fig.get_figwidth(), new_height)
adjust_height(10)
ax.text(0.5, 0.5, 'how2matplotlib.com', fontsize=12, ha='center')
plt.show()
Output:
示例6:使用axes的set_position调整子图位置和尺寸
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
# 创建图形和子图
fig, ax = plt.subplots()
# 设置子图的位置和尺寸
ax.set_position([0.1, 0.1, 0.8, 0.5]) # left, bottom, width, height
# 在子图上绘制文本
ax.text(0.5, 0.5, 'how2matplotlib.com', fontsize=12, ha='center')
plt.show()
Output:
示例7:结合Figure和Axes调整多个子图
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
# 创建图形和两个子图
fig, (ax1, ax2) = plt.subplots(2, 1)
# 调整整个图形的尺寸
fig.set_size_inches(8, 12)
# 分别调整每个子图的位置
ax1.set_position([0.1, 0.6, 0.8, 0.3]) # left, bottom, width, height
ax2.set_position([0.1, 0.1, 0.8, 0.3]) # left, bottom, width, height
# 在子图上绘制文本
ax1.text(0.5, 0.5, 'how2matplotlib.com', fontsize=12, ha='center')
ax2.text(0.5, 0.5, 'how2matplotlib.com', fontsize=12, ha='center')
plt.show()
Output:
示例8:使用tight_layout自动调整子图尺寸和位置
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
# 创建图形和子图
fig, axs = plt.subplots(2, 2)
# 自动调整子图参数,以确保子图不会重叠
fig.tight_layout()
for ax in axs.flatten():
ax.text(0.5, 0.5, 'how2matplotlib.com', fontsize=12, ha='center')
plt.show()
Output:
示例9:使用subplot2grid创建不规则子图布局
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
# 创建图形
fig = plt.figure()
# 使用subplot2grid创建子图
ax1 = plt.subplot2grid((3, 3), (0, 0), colspan=3)
ax2 = plt.subplot2grid((3, 3), (1, 0), colspan=2)
ax3 = plt.subplot2grid((3, 3), (1, 2), rowspan=2)
ax4 = plt.subplot2grid((3, 3), (2, 0))
ax5 = plt.subplot2grid((3, 3), (2, 1))
# 在子图上绘制文本
ax1.text(0.5, 0.5, 'how2matplotlib.com', fontsize=12, ha='center')
ax2.text(0.5, 0.5, 'how2matplotlib.com', fontsize=12, ha='center')
ax3.text(0.5, 0.5, 'how2matplotlib.com', fontsize=12, ha='center')
ax4.text(0.5, 0.5, 'how2matplotlib.com', fontsize=12, ha='center')
ax5.text(0.5, 0.5, 'how2matplotlib.com', fontsize=12, ha='center')
plt.show()
Output:
示例10:使用add_axes手动添加子图
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
# 创建图形
fig = plt.figure()
# 手动添加子图
ax = fig.add_axes([0.1, 0.1, 0.8, 0.3]) # left, bottom, width, height
# 在子图上绘制文本
ax.text(0.5, 0.5, 'how2matplotlib.com', fontsize=12, ha='center')
plt.show()
Output:
示例11:使用figure.add_subplot调整子图位置
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
# 创建图形
fig = plt.figure()
# 添加子图
ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212)
# 调整子图的位置
fig.subplots_adjust(hspace=0.5) # 调整子图之间的垂直间距
# 在子图上绘制文本
ax1.text(0.5, 0.5, 'how2matplotlib.com', fontsize=12, ha='center')
ax2.text(0.5, 0.5, 'how2matplotlib.com', fontsize=12, ha='center')
plt.show()
Output:
示例12:使用subplots和figure.subplots_adjust
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
# 创建图形和子图
fig, axs = plt.subplots(2, 2)
# 调整子图间距
fig.subplots_adjust(hspace=0.5, wspace=0.5)
# 在每个子图上绘制文本
for ax in axs.flatten():
ax.text(0.5, 0.5, 'how2matplotlib.com', fontsize=12, ha='center')
plt.show()
Output:
示例13:使用AxesDivider调整子图尺寸
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
from mpl_toolkits.axes_grid1 import make_axes_locatable
# 创建图形和子图
fig, ax = plt.subplots()
# 创建分割器
divider = make_axes_locatable(ax)
# 添加新的子图
ax2 = divider.append_axes("bottom", size="20%", pad=0.1)
# 在子图上绘制文本
ax.text(0.5, 0.5, 'how2matplotlib.com', fontsize=12, ha='center')
ax2.text(0.5, 0.5, 'how2matplotlib.com', fontsize=12, ha='center')
plt.show()
Output:
示例14:使用inset_axes添加内嵌子图
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
from mpl_toolkits.axes_grid1 import make_axes_locatable
# 创建图形和子图
fig, ax = plt.subplots()
# 添加内嵌子图
ax_inset = ax.inset_axes([0.1, 0.1, 0.3, 0.3]) # left, bottom, width, height
# 在子图上绘制文本
ax.text(0.5, 0.5, 'how2matplotlib.com', fontsize=12, ha='center')
ax_inset.text(0.5, 0.5, 'how2matplotlib.com', fontsize=12, ha='center')
plt.show()
Output:
示例15:使用constrained_layout自动调整布局
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
from mpl_toolkits.axes_grid1 import make_axes_locatable
# 创建图形和子图
fig, axs = plt.subplots(2, 2, constrained_layout=True)
# 在每个子图上绘制文本
for ax in axs.flatten():
ax.text(0.5, 0.5, 'how2matplotlib.com', fontsize=12, ha='center')
plt.show()
Output:
示例16:使用subplot_tool()调整子图参数
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
from mpl_toolkits.axes_grid1 import make_axes_locatable
# 创建图形和子图
fig, ax = plt.subplots()
# 在子图上绘制文本
ax.text(0.5, 0.5, 'how2matplotlib.com', fontsize=12, ha='center')
# 调用subplot_tool()进行交互式调整
plt.subplot_tool()
plt.show()
Output:
示例17:使用set_aspect调整子图的纵横比
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
from mpl_toolkits.axes_grid1 import make_axes_locatable
# 创建图形和子图
fig, ax = plt.subplots()
# 设置子图的纵横比
ax.set_aspect('equal')
# 在子图上绘制文本
ax.text(0.5, 0.5, 'how2matplotlib.com', fontsize=12, ha='center')
plt.show()
Output:
示例18:使用add_subplot方法与sharex, sharey参数
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
from mpl_toolkits.axes_grid1 import make_axes_locatable
# 创建图形
fig = plt.figure()
# 添加子图,共享x轴和y轴
ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212, sharex=ax1, sharey=ax1)
# 在子图上绘制文本
ax1.text(0.5, 0.5, 'how2matplotlib.com', fontsize=12, ha='center')
ax2.text(0.5, 0.5, 'how2matplotlib.com', fontsize=12, ha='center')
plt.show()
Output:
示例19:使用Figure的add_axes方法手动创建子图
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
from mpl_toolkits.axes_grid1 import make_axes_locatable
# 创建图形
fig = plt.figure()
# 手动添加子图
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8]) # left, bottom, width, height
# 在子图上绘制文本
ax.text(0.5, 0.5, 'how2matplotlib.com', fontsize=12, ha='center')
plt.show()
Output:
示例20:使用plt.subplots_adjust全局调整子图布局
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
from mpl_toolkits.axes_grid1 import make_axes_locatable
# 创建图形和子图
fig, axs = plt.subplots(2, 2)
# 全局调整子图布局
plt.subplots_adjust(hspace=0.5, wspace=0.5)
# 在每个子图上绘制文本
for ax in axs.flatten():
ax.text(0.5, 0.5, 'how2matplotlib.com', fontsize=12, ha='center')
plt.show()
Output:
以上示例展示了在Matplotlib中以绝对方式调整单个子图高度的多种方法。通过这些示例,你可以根据具体的需求选择合适的方法来调整子图的尺寸和布局。