使用Matplotlib的tricontourf()绘制等高线时的标注异常问题
解决Matplotlib等高线标注混乱的问题
问题根源在于你直接用tricontourf(填充等高线)的返回值调用clabel。tricontourf负责填充颜色区域,它生成的内部轮廓不适合直接做标注,正确做法是分开绘制填充层和可标注的纯等高线层:
修改后的代码
import matplotlib.pyplot as plt import DataImportingContour as d import matplotlib.cm as cm def graphing_contour(): # 调整画布尺寸,让子图更舒展 fig, (ax1, ax2) = plt.subplots(2, figsize=(8, 8)) level_wallA = list(range(5, 44, 5)) print(level_wallA) # 配置Wall A子图参数 ax1.set_xticks(range(-5, 6)) ax1.set_yticks([0.5, 1]) ax1.set(xlabel='y/H', ylabel='z/H') ax1.set_title('Wall A') # 配置Wall B子图参数 ax2.set_xticks(range(-5, 6)) ax2.set_yticks([0.5, 1]) ax2.set(xlabel='y/H', ylabel='z/H') ax2.set_title('Wall B') # 第一步:绘制填充等高线(仅负责颜色填充) ax1.tricontourf(d.dict['x0_list'], d.dict['y0_list'], d.dict['z0_list'], cmap=cm.YlOrBr, levels=level_wallA) ax2.tricontourf(d.dict['x1_list'], d.dict['y1_list'], d.dict['z1_list'], cmap=cm.YlOrBr, levels=4) # 第二步:绘制纯等高线(用于标注),设置深色细线让轮廓清晰 cs1 = ax1.tricontour(d.dict['x0_list'], d.dict['y0_list'], d.dict['z0_list'], levels=level_wallA, colors='black', linewidths=0.5) cs2 = ax2.tricontour(d.dict['x1_list'], d.dict['y1_list'], d.dict['z1_list'], levels=4, colors='black', linewidths=0.5) # 对纯等高线添加标注,调整字体大小和颜色提升可读性 ax1.clabel(cs1, levels=level_wallA, inline=True, fontsize=8, colors='black') ax2.clabel(cs2, inline=True, fontsize=8, colors='black') # 添加颜色条,让数值与颜色对应更直观 fig.colorbar(cs1, ax=ax1) fig.colorbar(cs2, ax=ax2) fig.tight_layout() # 自动调整子图间距,避免标签重叠 fig.savefig('test.jpg', dpi=300) # 提高分辨率让图像更清晰 if __name__ == "__main__": graphing_contour()
关键改动说明
- 拆分图层:将颜色填充和等高线标注分离,
tricontourf专注填充,tricontour生成可标注的清晰轮廓 - 统一层级:确保
tricontour和clabel的levels参数一致,避免标注错位 - 优化可读性:通过
fontsize、colors调整标注样式,inline=True让标注嵌入等高线 - 画布优化:扩大画布尺寸、自动调整间距、提高保存分辨率,解决图像拥挤模糊问题
内容的提问来源于stack exchange,提问作者Vu Thanh Phan
相关产品推荐
相关产品推荐

