matplotlib imshow绘制切片后DataFrame出现坐标轴不对齐问题
问题原因
- 切片后的DataFrame未重置索引:用iloc切片后,df的行索引依然保留原始的
8~247,列索引保留原始的10~1013,而非从0开始计数。 - 绘图顺序和共享轴逻辑冲突:先调用
imshow绘制图像时,imshow默认将240行、1004列的数组映射到x:0~1003、y:0~239的坐标轴范围;后续绘制投影图时,x投影的y坐标用的是原始行索引8~247,y投影的x坐标用的是原始列索引10~1013,设置共享坐标轴后,matplotlib会自动拉伸坐标轴范围适配两个图的全部数据,最终坐标轴范围被拉到x:0~1013、y:0~247,就出现了多余的空白区域。 - 关闭共享轴后投影图不匹配:关闭共享轴后imshow的坐标轴范围可以恢复为默认的
0~1003、0~239,但投影图本身的坐标轴还是基于原始索引生成,自然不会和imshow的范围同步。
解决方法
有两种常用方案可选:
方案1:切片后重置DataFrame的索引
将切片后的DataFrame的行、列索引重置为从0开始的连续值,和imshow默认的坐标轴映射规则匹配,修改切片部分代码:
df = df.iloc[8:df.shape[0]-8,10:df.shape[1]-10] # 新增以下两行重置索引 df.index = range(df.shape[0]) df.columns = range(df.shape[1]) setData[x] = df
方案2:为imshow指定extent参数
手动设置imshow的坐标轴范围,使其和DataFrame的原始索引对齐,注意imshow的y轴默认是上大下小,所以extent的y轴参数要倒置,修改imshow调用代码:
ax[0][0].imshow(img,aspect='auto',cmap='plasma', vmin=img.stack().mean()-2*img.stack().std(), vmax=img.stack().mean()+2*img.stack().std(), # 新增extent参数:[xmin, xmax, ymax, ymin] extent = [img.columns.min(), img.columns.max(), img.index.max(), img.index.min()])
两种方案选其一即可解决坐标轴不匹配、出现空白的问题。
内容的提问来源于stack exchange,提问作者Chemistpp
相关产品推荐
相关产品推荐

