在使用Matplotlib绘制多个子图时,经常会遇到Y轴数字重叠的问题,这会影响图表的可读性。如下图所示,底部四个子图中的Y轴数字重叠在一起,难以区分。
import matplotlib.pyplot as plt
fig = plt.figure()
a1 = fig.add_subplot(421)
a2 = fig.add_subplot(422)
a3 = fig.add_subplot(423)
a4 = fig.add_subplot(424)
a5 = fig.add_subplot(425)
a6 = fig.add_subplot(426)
a7 = fig.add_subplot(427)
a8 = fig.add_subplot(428)
a1.plot(Msol, ilP, color='blue')
a1.set_xlabel(r'$M/M\odot$')
a1.set_ylabel(r'$Log Pressure$')
a2.plot(Msol, ilT, color='blue')
http://www.jshk.com.cn/mb/reg.asp?kefu=xiaoding;//爬虫IP免费获取;
a2.set_xlabel(r'$M/M\odot$')
a2.set_ylabel(r'$Log Temperature$')
a3.plot(Msol, ilRho, color='blue')
a3.set_xlabel(r'$M/M\odot$')
a3.set_ylabel(r'$Log Density$')
a4.plot(Msol, Rsol, color='blue')
a4.set_xlabel(r'$M/M\odot$')
a4.set_ylabel(r'$R/R\odot$')
a5.plot(Msol, Lsol, color='blue')
a5.set_xlabel(r'$M/M\odot$')
a5.set_ylabel(r'$L/L\odot$')
a6.plot(Msol, iK, color='blue')
a6.set_xlabel(r'$M/M\odot$')
a6.set_ylabel(r'$Opacity$')
a7.plot(Msol, ieg, color='blue')
a7.set_xlabel(r'$M/M\odot$')
a7.set_ylabel(r'$\epsilon$')
a8.plot(Msol, ir_c, color='blue')
a8.set_xlabel(r'$M/M\odot$')
a8.set_ylabel(r'$Convective Ratio$')
plt.tight_layout()
plt.show()
2、解决方案
方法一:使用get_ylim()、set_yticks()和set_fontsize()
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot( np.random.randn( 1000 ).cumsum( ) )
lb, ub = ax.get_ylim( )
ax.set_yticks( np.linspace(lb, ub, 25 ) )
for x in ax.get_yticklabels( ):
x.set_fontsize( 'small' )
方法二:调整刻度范围
根据Matplotlib文档,tight_layout()函数只对子图的位置和填充进行调整,而不会影响刻度范围和数量。因此,如果知道图表的大小,可以手动调整刻度范围。
fig, axes = plt.subplots(4, 2, figsize=(10, 8))
axes = axes.ravel()
for i, ax in enumerate(axes):
ax.plot(Msol, [ilP[i], ilT[i], ilRho[i], Rsol[i], Lsol[i], iK[i], ieg[i], ir_c[i]])
ax.set_xlabel(r'$M/M\odot$')
# 调整刻度范围
y_min, y_max = ax.get_ylim()
ax.set_ylim(y_min - 0.1, y_max + 0.1)
# 设置刻度标签大小
for label in ax.get_yticklabels():
label.set_fontsize('small')
plt.tight_layout()
plt.show()
代码例子
import numpy as np
import matplotlib.pyplot as plt
# 生成随机数据
Msol = np.linspace(0.1, 100, 1000)
ilP = np.random.randn(1000)
ilT = np.random.randn(1000)
ilRho = np.random.randn(1000)
Rsol = np.random.randn(1000)
Lsol = np.random.randn(1000)
iK = np.random.randn(1000)
ieg = np.random.randn(1000)
ir_c = np.random.randn(1000)
# 创建子图
fig, axes = plt.subplots(4, 2, figsize=(10, 8))
axes = axes.ravel()
# 绘制数据
for i, ax in enumerate(axes):
ax.plot(Msol, [ilP[i], ilT[i], ilRho[i], Rsol[i], Lsol[i], iK[i], ieg[i], ir_c[i]])
ax.set_xlabel(r'$M/M\odot$')
# 调整刻度范围
y_min, y_max = ax.get_ylim()
ax.set_ylim(y_min - 0.1, y_max + 0.1)
# 设置刻度标签大小
for label in ax.get_yticklabels():
label.set_fontsize('small')
# 调整布局
plt.tight_layout()
# 显示图表
plt.show()