Matplotlib的FormatStrFormatter返回错误的值

3

当尝试使用Seaborns的sns.heatmap函数绘制热图时,如果使用FormatStrFormatter格式化x轴,则会出现错误的刻度。 在构建所需的pivot数据框架之后,相关代码如下:

ax = sns.heatmap(oi_pivot_df, cmap=plt.cm.Spectral, cbar=True)
ax.xaxis.set_major_formatter(ticker.FormatStrFormatter('%.2f'))
ax.invert_yaxis()
ax.set_xlabel('moneyness')
ax.set_ylabel('time to maturity (years)')

fig = plt.gcf()
plt.tight_layout()

这里输入图片描述

在这里,x的取值范围为0.5到96.5。如果没有格式化程序,则x轴刻度线是实际范围:

这里输入图片描述

我应该如何更改格式化程序,以便返回格式化后的x轴刻度线,只显示前两位小数,例如在我的下面示例中,x轴应该从0.92到1.29。


你使用.StrMethodFormatter(fmt)是否能得到类似的结果? - wwii
是的,使用 ticker.StrMethodFormatter("{x:.2f}") 会得到相同(错误)的结果。 - Ben
2个回答

2
Seaborn使用FixedLocator和FixedFormatter。如果您单方面更改格式化程序,则预计结果将变得无用。如果使用格式化程序的动机是保留固定标签但更改小数位数,则一个简单的解决方案是重新格式化现有标签。
def fmt(s):
    try:
        n = "{:.2f}".format(float(s))
    except:
        n = ""
    return n

ax.set_xticklabels([fmt(label.get_text()) for label in ax.get_xticklabels()])

谢谢。不幸的是,这会触发“TypeError: float() argument must be a string or a number, not 'Text'”错误。问题在于label的示例看起来像这样:Text(0.5,0,'-0.10536051565782628') - Ben
问题在于您没有提供任何用于测试的 [mcve]。我认为更新后的答案现在应该可以工作了,但仍未经过测试。 - ImportanceOfBeingErnest
这个答案对我有用。 - Cypress Frankenfeld

0

我遇到了完全相同的问题。

我尝试过:

ax.xaxis.set_major_formatter((ticker.StrMethodFormatter("{x:.3f}"))

ax.xaxis.set_major_formatter(ticker.FormatStrFormatter("%.3f"))

还有许多其他的...

无论我做了什么,都没有效果 最终,这个方法可行:

df['col'] = df['col'].round(3)

将这些值四舍五入到小数点后三位。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接