Matplotlib FormatStrFormatter返回错误的值

时间:2018-05-28 18:05:50

标签: python matplotlib

当尝试使用Seaborns sns.heatmap函数绘制热图时,在使用FormatStrFormatter格式化x轴时出现错误的刻度。构建所需的pivot data frame后,相关代码为:

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()

enter image description here

这里,x在.5和96.5之间变化。没有格式化程序,x-ticks是真正的范围:

enter image description here

如何更改格式化程序,使其返回格式化的x刻度,以便我只能看到前2位小数,例如在下面的例子中,x轴应该从0.92到1.29。

2 个答案:

答案 0 :(得分:1)

Seaborn使用FixedLocator和FixedFormatter。如果您单方面更改格式化程序,则预计结果将变得无用。如果使用Formatter的动机是保留固定标签,但改变小数位数,一个简单的解决方案就是重新格式化当前标签。

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()])

答案 1 :(得分:0)

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

我尝试过:

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

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

还有更多...

无论我做什么,都没有效果 最后,这可行:

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

这会将值本身四舍五入到小数点后三位。