如何用Matplotlib读取PNG文件以完整显示图像内容?
问题
使用Matplotlib结合spectrum_utils生成PNG格式谱图后,在图片查看器中能完整显示所有内容(包括谱峰),但用Matplotlib的imread和imshow读取显示时,只能看到坐标系,看不到谱峰;添加aspect='auto'参数后又出现图中图的问题。需要在无原始谱数据的场景下读取并完整显示该图像。
代码示例:
import spectrum_utils.plot as sup import spectrum_utils.spectrum as sus import matplotlib as plt db_hit_spectrum = sus.MsmsSpectrum('9407', 200.2373, 1, [71.0852, 85.1012], [2, 1]) query_spectrum = sus.MsmsSpectrum('9407', 200.2372, 1, [71.0858, 85.1013, 98.9841], [13000000., 6700000., 850000.]) fig, ax_1 = plt.subplots(figsize=(12, 6)) ax_1.set_title(f"DB hit of N-Methyldodecylamine and query spectrum with ID 9407") sup.mirror(query_spectrum, db_hit_spectrum, spectrum_kws={'grid': False}) fig.savefig("test.png") a = plt.imread("test.png") plt.imshow(a)
解决方案
问题根源
- Matplotlib导入错误:原代码中
import matplotlib as plt是错误的,正确导入应为import matplotlib.pyplot as plt,错误导入会导致部分绘图功能异常。 imshow默认aspect='equal'强制图像保持像素比例,而生成的谱图宽高比为2:1(12:6),和Matplotlib默认的接近正方形的绘图区域不匹配,导致谱峰被压缩至几乎不可见。- 添加
aspect='auto'后出现图中图,是因为生成谱图的绘图窗口未关闭,imshow直接在原有坐标轴上叠加显示。
修正代码
import spectrum_utils.plot as sup import spectrum_utils.spectrum as sus # 修正Matplotlib导入方式 import matplotlib.pyplot as plt db_hit_spectrum = sus.MsmsSpectrum('9407', 200.2373, 1, [71.0852, 85.1012], [2, 1]) query_spectrum = sus.MsmsSpectrum('9407', 200.2372, 1, [71.0858, 85.1013, 98.9841], [13000000., 6700000., 850000.]) # 生成并保存谱图 fig, ax_1 = plt.subplots(figsize=(12, 6)) ax_1.set_title(f"DB hit of N-Methyldodecylamine and query spectrum with ID 9407") sup.mirror(query_spectrum, db_hit_spectrum, spectrum_kws={'grid': False}) fig.savefig("test.png") plt.close(fig) # 关闭生成谱图的窗口,避免干扰后续显示 # 读取并完整显示图像 img = plt.imread("test.png") # 创建与原始谱图尺寸一致的新窗口 plt.figure(figsize=(12, 6)) plt.imshow(img, aspect='auto') # 隐藏重复的坐标轴刻度,匹配图片查看器效果 plt.axis('off') plt.show()
关键说明
plt.close(fig):关闭生成谱图的窗口,彻底避免绘图叠加问题。- 保持
figsize与原始谱图一致:让显示比例完全匹配生成的PNG文件。 plt.axis('off'):隐藏多余的坐标轴元素,让显示效果和图片查看器一致。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

