101

I created this plot using Matlab

enter image description here

Using matplotlib, the x-axies draws large numbers such as 100000, 200000, 300000. I would like to have something like 1, 2, 3 and a 10^5 to indicate that it's actually 100000, 200000, 300000.

Is there a simple way to create such scale in matplotlib?

4

4 回答 4

156

尝试使用matplotlib.pyplot.ticklabel_format

import matplotlib.pyplot as plt
...
plt.ticklabel_format(style='sci', axis='x', scilimits=(0,0))

这将科学记数法(即a x 10^b)应用于您的 x 轴刻度线

于 2012-07-20T12:56:25.280 回答
18

这与其说是对您的原始问题的回答,不如说是对您在问题正文中提出的问题之一的回答。

一点序言,让我的命名看起来并不奇怪:

import matplotlib
from matplotlib import rc
from matplotlib.figure import Figure
ax = self.figure.add_subplot( 111 )

如前所述,您可以使用 ticklabel_format 指定 matplotlib 应该对大值或小值使用科学记数法:

ax.ticklabel_format(style='sci',scilimits=(-3,4),axis='both')

您可以使用 rcParams 中的标志(来自 matplotlib 导入 rcParams)或直接设置它们来影响其显示方式。我还没有找到比在 '1e' 和 'x10^' 科学记数法之间转换更优雅的方式:

ax.xaxis.major.formatter._useMathText = True

这应该给你更多的 Matlab-esc,并且确实可以说是更好的外观。我认为以下应该做同样的事情:

rc('text', usetex=True)
于 2013-03-25T13:53:50.890 回答
11

量格式化程序支持收集指数。文档如下:

类 matplotlib.ticker.ScalarFormatter(useOffset=True, useMathText=False, useLocale=None) 基础:matplotlib.ticker.Formatter

刻度位置是一个普通的旧数字。如果 useOffset==True 并且数据范围远小于数据平均值,则将确定偏移量,以使刻度标签有意义。科学记数法用于数据 < 10^-n 或数据 >= 10^m,其中 n 和 m 是使用 set_powerlimits((n,m)) 设置的功率限制。这些的默认值由 axes.formatter.limits rc 参数控制。

你的技术是:

from matplotlib.ticker import ScalarFormatter
xfmt = ScalarFormatter()
xfmt.set_powerlimits((-3,3))  # Or whatever your limits are . . .
{{ Make your plot }}
gca().xaxis.set_major_formatter(xfmt)

要获得以格式显示的指数x10^5,请使用 . 实例化 ScalarFormatter useMathText=True

后像

您还可以使用:

xfmt.set_useOffset(10000)

要得到这样的结果:

在此处输入图像描述

于 2012-07-20T13:00:14.770 回答
8

我找到了简单的解决方案

pylab.ticklabel_format(axis='y',style='sci',scilimits=(1,4))
于 2012-12-21T06:17:17.663 回答