Matplotlib:指定刻度标签的浮点数格式

时间:2015-03-21 22:25:27

标签: python python-3.x matplotlib scipy

我试图在matplotlib子图环境中将格式设置为两个十进制数。不幸的是,我不知道如何解决这个任务。

为防止在y轴上使用科学记数法,我使用了ScalarFormatter(useOffset=False),如下面的代码段所示。我认为我的任务应该通过将更多的选项/参数传递给使用的格式化程序来解决。但是,我在matplotlib的文档中找不到任何提示。

如何设置两位小数或无(两种情况都需要)?遗憾的是,我无法提供样本数据。


- SNIPPET -

f, axarr = plt.subplots(3, sharex=True)

data = conv_air
x = range(0, len(data))

axarr[0].scatter(x, data)
axarr[0].set_ylabel('$T_\mathrm{air,2,2}$', size=FONT_SIZE)
axarr[0].yaxis.set_major_locator(MaxNLocator(5))
axarr[0].yaxis.set_major_formatter(ScalarFormatter(useOffset=False))
axarr[0].tick_params(direction='out', labelsize=FONT_SIZE)
axarr[0].grid(which='major', alpha=0.5)
axarr[0].grid(which='minor', alpha=0.2)

data = conv_dryer
x = range(0, len(data))

axarr[1].scatter(x, data)
axarr[1].set_ylabel('$T_\mathrm{dryer,2,2}$', size=FONT_SIZE)
axarr[1].yaxis.set_major_locator(MaxNLocator(5))
axarr[1].yaxis.set_major_formatter(ScalarFormatter(useOffset=False))
axarr[1].tick_params(direction='out', labelsize=FONT_SIZE)
axarr[1].grid(which='major', alpha=0.5)
axarr[1].grid(which='minor', alpha=0.2)

data = conv_lambda
x = range(0, len(data))

axarr[2].scatter(x, data)
axarr[2].set_xlabel('Iterationsschritte', size=FONT_SIZE)
axarr[2].xaxis.set_major_locator(MaxNLocator(integer=True))
axarr[2].set_ylabel('$\lambda$', size=FONT_SIZE)
axarr[2].yaxis.set_major_formatter(ScalarFormatter(useOffset=False))
axarr[2].yaxis.set_major_locator(MaxNLocator(5))
axarr[2].tick_params(direction='out', labelsize=FONT_SIZE)
axarr[2].grid(which='major', alpha=0.5)
axarr[2].grid(which='minor', alpha=0.2)

5 个答案:

答案 0 :(得分:75)

请参阅generalspecifically

中的相关文档
from matplotlib.ticker import FormatStrFormatter

fig, ax = plt.subplots()

ax.yaxis.set_major_formatter(FormatStrFormatter('%.2f'))

enter image description here

答案 1 :(得分:10)

上面的答案可能是正确的方法,但对我没有用。

解决它的黑客方法如下:

ax = <whatever your plot is> 
# get the current labels 
labels = [item.get_text() for item in ax.get_xticklabels()]
# Beat them into submission and set them back again
ax.set_xticklabels([str(round(float(label), 2)) for label in labels])
# Show the plot, and go home to family 
plt.show()

答案 2 :(得分:3)

如果您直接使用matplotlib的pyplot(plt),并且如果您更熟悉新样式的格式字符串,则可以尝试以下操作:

from matplotlib.ticker import StrMethodFormatter
plt.gca().yaxis.set_major_formatter(StrMethodFormatter('{x:,.0f}')) # No decimal places
plt.gca().yaxis.set_major_formatter(StrMethodFormatter('{x:,.2f}')) # 2 decimal places

来自documentation

  

matplotlib.ticker.StrMethodFormatter(fmt)

类      

使用新的格式字符串(如str.format()所用)来格式化   勾选。

     

用于该值的字段必须标记为x,并且用于   该位置必须标记为pos。

答案 3 :(得分:0)

在matplotlib 3.1中,您也可以使用ticklabel_format。为防止科学计数法没有偏差:

plt.gca().ticklabel_format(axis='both', style='plain', useOffset=False)

答案 4 :(得分:0)

使用lambda函数设置标签格式

do notation explained, in vivid colors 3倍相同的图,不同的y标签

最小示例

if

当然,您也可以使用“ real”功能代替lambda。 enter image description here