matplotlib 将轴偏移值格式化为整数或特定数字

5ssjco0h  于 2023-05-07  发布在  其他
关注(0)|答案(8)|浏览(123)

我有一个matplotlib图,我绘制的数据总是被称为纳秒(1 e-9)。在y轴上,如果我有几十纳秒的数据,即。44 e-9,轴上的值显示为4.4,其中+1e-8作为偏移。是否有任何方法可以强制轴显示为44,偏移量为+1e-9?
同样的道理也适用于我的x轴,其中轴显示+5.54478e4,我宁愿它显示+55447的偏移量(整数,没有小数-这里的值是以天为单位)。
我试过几种这样的方法:

p = axes.plot(x,y)
p.ticklabel_format(style='plain')

对于x轴,但这不起作用,虽然我可能使用错误或误解了文档中的某些东西,有人能告诉我正确的方向吗?
谢谢,乔纳森

我试着用格式化程序做一些事情,但还没有找到任何解决方案...:

myyfmt = ScalarFormatter(useOffset=True)
myyfmt._set_offset(1e9)
axes.get_yaxis().set_major_formatter(myyfmt)

和/或

myxfmt = ScalarFormatter(useOffset=True)
myxfmt.set_portlimits((-9,5))
axes.get_xaxis().set_major_formatter(myxfmt)

顺便说一句,我实际上对“偏移量”对象实际驻留的位置感到困惑......它是主/次刻度的一部分吗?

a5g8bdjr

a5g8bdjr1#

我遇到了同样的问题,这些行解决了这个问题:

from matplotlib.ticker import ScalarFormatter

y_formatter = ScalarFormatter(useOffset=False)
ax.yaxis.set_major_formatter(y_formatter)
vsmadaxz

vsmadaxz2#

一个更简单的解决方案是简单地自定义刻度标签。举个例子:

from pylab import *

# Generate some random data...
x = linspace(55478, 55486, 100)
y = random(100) - 0.5
y = cumsum(y)
y -= y.min()
y *= 1e-8

# plot
plot(x,y)

# xticks
locs,labels = xticks()
xticks(locs, map(lambda x: "%g" % x, locs))

# ytikcs
locs,labels = yticks()
yticks(locs, map(lambda x: "%.1f" % x, locs*1e9))
ylabel('microseconds (1E-9)')

show()

请注意,在y轴的情况下,我将值乘以1e9,然后在y标签中提到该常数

编辑

另一个选项是通过手动将其文本添加到图的顶部来伪造指数乘数:

locs,labels = yticks()
yticks(locs, map(lambda x: "%.1f" % x, locs*1e9))
text(0.0, 1.01, '1e-9', fontsize=10, transform = gca().transAxes)

EDIT2

也可以以相同的方式设置x轴偏移值的格式:

locs,labels = xticks()
xticks(locs, map(lambda x: "%g" % x, locs-min(locs)))
text(0.92, -0.07, "+%g" % min(locs), fontsize=10, transform = gca().transAxes)

yhqotfr8

yhqotfr83#

你必须子类化ScalarFormatter来做你需要做的事情。_set_offset只是增加了一个常数,你想设置ScalarFormatter.orderOfMagnitude。不幸的是,手动设置orderOfMagnitude不会做任何事情,因为当调用ScalarFormatter示例来格式化轴刻度标签时,它会被重置。它不应该这么复杂,但我找不到一个更简单的方法来做你想要的...下面是一个例子:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import ScalarFormatter, FormatStrFormatter

class FixedOrderFormatter(ScalarFormatter):
    """Formats axis ticks using scientific notation with a constant order of 
    magnitude"""
    def __init__(self, order_of_mag=0, useOffset=True, useMathText=False):
        self._order_of_mag = order_of_mag
        ScalarFormatter.__init__(self, useOffset=useOffset, 
                                 useMathText=useMathText)
    def _set_orderOfMagnitude(self, range):
        """Over-riding this to avoid having orderOfMagnitude reset elsewhere"""
        self.orderOfMagnitude = self._order_of_mag

# Generate some random data...
x = np.linspace(55478, 55486, 100) 
y = np.random.random(100) - 0.5
y = np.cumsum(y)
y -= y.min()
y *= 1e-8

# Plot the data...
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x, y, 'b-')

# Force the y-axis ticks to use 1e-9 as a base exponent 
ax.yaxis.set_major_formatter(FixedOrderFormatter(-9))

# Make the x-axis ticks formatted to 0 decimal places
ax.xaxis.set_major_formatter(FormatStrFormatter('%0.0f'))
plt.show()

这会产生如下结果:

而默认格式如下所示:

希望能帮上一点忙!
编辑:无论如何,我也不知道偏移标签在哪里...这将是稍微容易只是手动设置它,但我不知道如何做到这一点...我觉得肯定有比这更简单的办法。不过,它很管用!

oo7oh9g9

oo7oh9g94#

与Amro的答案类似,可以使用FuncFormatter

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter

# Generate some random data...
x = np.linspace(55478, 55486, 100) 
y = np.random.random(100) - 0.5
y = np.cumsum(y)
y -= y.min()
y *= 1e-8

# Plot the data...
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x, y, 'b-')

# Force the y-axis ticks to use 1e-9 as a base exponent 
ax.yaxis.set_major_formatter(FuncFormatter(lambda x, pos: ('%.1f')%(x*1e9)))
ax.set_ylabel('microseconds (1E-9)')

# Make the x-axis ticks formatted to 0 decimal places
ax.xaxis.set_major_formatter(FuncFormatter(lambda x, pos: '%.0f'%x))
plt.show()
yfjy0ee7

yfjy0ee75#

Gonzalo的解决方案在添加set_scientific(False)后开始对我有效:

ax=gca()
fmt=matplotlib.ticker.ScalarFormatter(useOffset=False)
fmt.set_scientific(False)
ax.xaxis.set_major_formatter(fmt)
ruyhziif

ruyhziif6#

正如注解和in this answer中所指出的,偏移可以通过执行以下操作全局关闭:

matplotlib.rcParams['axes.formatter.useoffset'] = False
j9per5c4

j9per5c47#

我认为更优雅的方法是使用代码格式化程序。下面是xaxis和yaxis的示例:

from pylab import *
from matplotlib.ticker import MultipleLocator, FormatStrFormatter

majorLocator   = MultipleLocator(20)
xFormatter = FormatStrFormatter('%d')
yFormatter = FormatStrFormatter('%.2f')
minorLocator   = MultipleLocator(5)

t = arange(0.0, 100.0, 0.1)
s = sin(0.1*pi*t)*exp(-t*0.01)

ax = subplot(111)
plot(t,s)

ax.xaxis.set_major_locator(majorLocator)
ax.xaxis.set_major_formatter(xFormatter)
ax.yaxis.set_major_formatter(yFormatter)

#for the minor ticks, use no labels; default NullFormatter
ax.xaxis.set_minor_locator(minorLocator)
dgsult0t

dgsult0t8#

对于第二部分,我的解决方案是:

class CustomScalarFormatter(ScalarFormatter):
    def format_data(self, value):
        if self._useLocale:
            s = locale.format_string('%1.2g', (value,))
        else:
            s = '%1.2g' % value
        s = self._formatSciNotation(s)
        return self.fix_minus(s)
xmajorformatter = CustomScalarFormatter()  # default useOffset=True
axes.get_xaxis().set_major_formatter(xmajorformatter)

显然,你可以设置格式字符串为任何你想要的。

相关问题