seaborn热图调用axvline加竖线报ymin参数多值错误是什么原因
错误含义
TypeError: axvline() got multiple values for argument 'ymin' 表示axvline方法的ymin参数被多次赋值,触发冲突。axvline的参数顺序为axvline(x, ymin=0, ymax=1, **kwargs),你代码中将*ax.get_ylim()作为位置参数传入,get_ylim()返回的两个值会依次赋值给ymin、ymax,后续又显式传入了ymin、ymax关键字参数,导致同一参数被重复赋值,触发报错。
另外补充:axvline的ymin、ymax取值范围为0-1,代表y轴高度的比例,你直接传入数值为几千、几万的lines元素,就算参数不冲突,也会因为超出0-1范围导致线条无法正常显示。
解决方案
根据你的实际需求选择对应修改方式:
1. 竖线占满整个y轴高度
直接删除*ax.get_ylim()参数即可,ymin、ymax默认取值为0和1,刚好对应全高度显示。
修正后代码示例:
lines = [0,10,300,500,2560, 34500] with sns.axes_style("white"): f, ax = plt.subplots(figsize=(50, 50)) ax = sns.heatmap(X) # 可根据需求修改x参数的数值,两个相同x的竖线会重叠 ax.axvline(4000, lw = 8.0, color = 'red') ax.axvline(5000, lw = 8.0, color = 'green')
2. 竖线仅显示在y轴指定数据区间
先将你lines里的y轴数据坐标转换为0-1的比例值,再传给ymin、ymax参数,同样删除*ax.get_ylim()参数:
修正后代码示例:
lines = [0,10,300,500,2560, 34500] with sns.axes_style("white"): f, ax = plt.subplots(figsize=(50, 50)) ax = sns.heatmap(X) # 转换数据坐标为轴比例 y_data_min, y_data_max = ax.get_ylim() y_range = y_data_max - y_data_min ymin1 = (lines[0] - y_data_min)/y_range ymax1 = (lines[4] - y_data_min)/y_range ymin2 = (lines[5] - y_data_min)/y_range ax.axvline(4000, ymin = ymin1, ymax = ymax1, lw = 8.0, color = 'red') ax.axvline(4000, ymin = ymin2, lw = 8.0, color = 'green')
内容的提问来源于stack exchange,提问作者Noob Programmer
相关产品推荐
相关产品推荐

