Matplotlib 将子图标题对齐到图的顶部
Matplotlib align subplot titles to top of figure
给定以下最小示例,如何使子图的标题垂直对齐(不移动子图本身)?我需要将纵横比设置为 'equal',这样图就不会被拉伸。我故意选择了不同比例的数据。
import numpy as np
import matplotlib.pyplot as plt
data1 = np.random.multivariate_normal(mean=[0,0],cov=np.diag([5,2]),size=50)
data2 = np.random.multivariate_normal(mean=[5,3],cov=np.diag([10,20]),size=50)
data3 = np.random.multivariate_normal(mean=[-8,7],cov=np.diag([1,7]),size=50)
fig, (ax1,ax2,ax3) = plt.subplots(1,3,figsize=(5,2))
ax1.scatter(data1[:,0],data1[:,1])
ax2.scatter(data2[:,0],data2[:,1])
ax3.scatter(data3[:,0],data3[:,1])
ax1.set_aspect('equal')
ax2.set_aspect('equal')
ax3.set_aspect('equal')
ax1.set_title('Title 1')
ax2.set_title('Title 2')
ax3.set_title('Title 3')
plt.show()
编辑:问题已关闭,我不确定为什么。我要求的是在不移动情节本身的情况下对齐多个子情节的标题。我认为任何建议的问题都与我的要求无关。
使用 subfigure suptitles 沿 y 自动 top-align 并沿 x 自动 center-align:
- 创建 3
subfigures
(需要 matplotlib 3.4.0+)
- 为每个子图添加一个 100% 宽度的轴
- 为每个子图添加一个
suptitle
字幕将 top-align 编辑到图形并 center-align 编辑到轴(因为轴是 100% 宽度):
fig = plt.figure(constrained_layout=True, figsize=(10, 4))
# create 3 subfigs (width padding=30%)
sf1, sf2, sf3 = fig.subfigures(1, 3, wspace=0.3)
# add an axes to each subfig (left=0%, bottom=0%, width=100%, height=90%)
ax1 = sf1.add_axes([0, 0, 1, 0.9])
ax2 = sf2.add_axes([0, 0, 1, 0.9])
ax3 = sf3.add_axes([0, 0, 1, 0.9])
ax1.scatter(data1[:, 0], data1[:, 1])
ax2.scatter(data2[:, 0], data2[:, 1])
ax3.scatter(data3[:, 0], data3[:, 1])
ax1.set_aspect('equal')
ax2.set_aspect('equal')
ax3.set_aspect('equal')
# plot suptitle per subfig
sf1.suptitle('suptitle 1')
sf2.suptitle('suptitle 2')
sf3.suptitle('suptitle 3')
plt.show()
给定以下最小示例,如何使子图的标题垂直对齐(不移动子图本身)?我需要将纵横比设置为 'equal',这样图就不会被拉伸。我故意选择了不同比例的数据。
import numpy as np
import matplotlib.pyplot as plt
data1 = np.random.multivariate_normal(mean=[0,0],cov=np.diag([5,2]),size=50)
data2 = np.random.multivariate_normal(mean=[5,3],cov=np.diag([10,20]),size=50)
data3 = np.random.multivariate_normal(mean=[-8,7],cov=np.diag([1,7]),size=50)
fig, (ax1,ax2,ax3) = plt.subplots(1,3,figsize=(5,2))
ax1.scatter(data1[:,0],data1[:,1])
ax2.scatter(data2[:,0],data2[:,1])
ax3.scatter(data3[:,0],data3[:,1])
ax1.set_aspect('equal')
ax2.set_aspect('equal')
ax3.set_aspect('equal')
ax1.set_title('Title 1')
ax2.set_title('Title 2')
ax3.set_title('Title 3')
plt.show()
编辑:问题已关闭,我不确定为什么。我要求的是在不移动情节本身的情况下对齐多个子情节的标题。我认为任何建议的问题都与我的要求无关。
使用 subfigure suptitles 沿 y 自动 top-align 并沿 x 自动 center-align:
- 创建 3
subfigures
(需要 matplotlib 3.4.0+) - 为每个子图添加一个 100% 宽度的轴
- 为每个子图添加一个
suptitle
字幕将 top-align 编辑到图形并 center-align 编辑到轴(因为轴是 100% 宽度):
fig = plt.figure(constrained_layout=True, figsize=(10, 4))
# create 3 subfigs (width padding=30%)
sf1, sf2, sf3 = fig.subfigures(1, 3, wspace=0.3)
# add an axes to each subfig (left=0%, bottom=0%, width=100%, height=90%)
ax1 = sf1.add_axes([0, 0, 1, 0.9])
ax2 = sf2.add_axes([0, 0, 1, 0.9])
ax3 = sf3.add_axes([0, 0, 1, 0.9])
ax1.scatter(data1[:, 0], data1[:, 1])
ax2.scatter(data2[:, 0], data2[:, 1])
ax3.scatter(data3[:, 0], data3[:, 1])
ax1.set_aspect('equal')
ax2.set_aspect('equal')
ax3.set_aspect('equal')
# plot suptitle per subfig
sf1.suptitle('suptitle 1')
sf2.suptitle('suptitle 2')
sf3.suptitle('suptitle 3')
plt.show()