Seaborn问题:PairGrid中distplot的Y轴为何非计数且出现负值?
为什么PairGrid里的distplot Y轴会出现负值?
嘿,这个问题其实是PairGrid的坐标轴共享机制导致的,我来给你拆解清楚:
核心原因
当你用PairGrid的时候,它默认会共享每一行的Y轴范围、每一列的X轴范围——这样做是为了让整个网格里的散点图(offdiag部分)坐标轴对齐,方便你对比不同变量间的关系。
但对角线上的distplot是单变量的直方图,它的Y轴本质是计数(肯定是正数),但因为要和同一行的散点图Y轴范围保持一致(散点图的Y轴是另一个变量的取值,可能包含负值),所以PairGrid会强制把对角图的Y轴范围拉宽,包含负值区间——但你仔细看的话,直方图的柱子根本不会延伸到负值区域,只是轴的刻度显示了负数而已。
而你单独画distplot时,matplotlib会自动根据数据调整Y轴范围,只显示从0开始的正数区间,所以不会出现负值。
解决办法:手动修正对角图的Y轴范围
你可以在绘制完PairGrid之后,遍历所有对角轴,把Y轴的下限设置为0,这样就和单独画的distplot效果一致了:
import seaborn as sns import matplotlib.pyplot as plt import pandas as pd # 你的PairGrid代码 g = sns.PairGrid(myDataFrame) g = g.map_diag(sns.distplot, kde=False) g = g.map_offdiag(plt.scatter) # 修正对角轴的Y轴范围 for ax in g.diag_axes: ax.set_ylim(bottom=0) plt.show()
额外说明
你提到左上角的图和单独绘制的distplot是同一图——没错,数据和绘图逻辑完全一样,只是PairGrid强制统一了坐标轴范围,导致视觉上Y轴出现了负值,实际直方图的计数是正常的正数。
内容的提问来源于stack exchange,提问作者AMTheMonkey




