在Matplotlib中更改X轴比例


93

我使用Matlab创建了这个图

在此处输入图片说明

使用matplotlib,x轴绘制大量数字,例如100000、200000、300000。我想使用类似1、2、3和10 ^ 5的数字来表示它实际上是100000、200000、300000。

有没有一种简单的方法可以在matplotlib中创建这种比例?

Answers:


145

尝试使用matplotlib.pyplot.ticklabel_format

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

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


9
是否可以添加偏移量?(例如,代替0.0、0.5、1.0、1.5,...和x 10 ^ b,它将是0、5、10、15,...和x 10 ^ {b-1})
Eagle

24
ticklabel_format也是轴对象的一种方法,您可以尝试类似的方法ax.ticklabel_format(style='sci', axis='x', scilimits=(0,0))
Covich

如果您有一个包含2个图的子图,该如何工作?
FaCoffee,2017年

2
@Eagle对不起,您关于添加偏移量的后续问题就是我所指的问题。我的x轴是,[0.1, 0.2, ...]并且我希望[1, 2, ...]使用调整后的指数。您能够为此找到解决方案吗?
trianta2

@Eagle我也对提到的trianta2问题感兴趣
Ben Usman

15

这并不是您对原始问题的答案,而是对您在问题正文中所提出的疑问之一的答案。

些许序言,以便我的名字看起来并不奇怪:

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)

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)

要获得这样的结果:

在此处输入图片说明


3
实例化ScalarFormatter useMathText=True以获取x10^4
蒂尔·霍夫曼

9

我找到了简单的解决方案

pylab.ticklabel_format(axis='y',style='sci',scilimits=(1,4))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.