将 matplotlib 偏移表示法从科学改为普通

Posted

技术标签:

【中文标题】将 matplotlib 偏移表示法从科学改为普通【英文标题】:Change matplotlib offset notation from scientific to plain 【发布时间】:2018-12-21 02:19:15 【问题描述】:

我想将绘图中 y 轴偏移的格式设置为非科学记数法,但我找不到执行此操作的设置。其他问题及其解决方案描述了如何完全删除偏移量,或将 y 刻度设置为科学/普通符号;我还没有找到设置偏移量符号本身的答案。

我已经尝试过使用这两个选项,但我认为它们适用于 y 刻度,而不是偏移量:

ax.ticklabel_format(axis='y', style='plain', useOffset=6378.1)

ax.get_yaxis().get_major_formatter().set_scientific(False)

所以,实际结果是+6.3781e3,当我想要+6378.1

有什么办法吗?

编辑:添加示例代码和图:

#!/usr/bin/env python

from matplotlib import pyplot as plt
from matplotlib import ticker
plt.rcParams['font.family'] = 'monospace'
import random

Date = range(10)
R = [6373.1+10*random.random() for i in range(10)]

fig, ax = plt.subplots(figsize=(9,6))
ax.plot(Date,R,'-D',zorder=2,markersize=3)
ax.ticklabel_format(axis='y', style='plain', useOffset=6378.1)
ax.set_ylabel('Mean R (km)',fontsize='small',labelpad=1)

plt.show()

【问题讨论】:

请添加一个能够重现您的问题的最小工作示例。 @b-fg 添加了工作代码和图 好。请看我的回答。 【参考方案1】:

您可以继承默认的ScalarFormatter 并替换get_offset 方法,这样它就可以简单地返回偏移量。请注意,如果您想让它与乘法“偏移量”兼容,则需要调整此解决方案(目前它只打印一个警告)。

from matplotlib import pyplot as plt
import matplotlib.ticker
import random

class PlainOffsetScalarFormatter(matplotlib.ticker.ScalarFormatter):
    def get_offset(self):
        if len(self.locs) == 0:
            return ''
        if self.orderOfMagnitude:
            print("Your plot will likely be labelled incorrectly")
        return self.offset

Date = range(10)
R = [6373.1+10*random.random() for i in range(10)]

fig, ax = plt.subplots(figsize=(9,6))
ax.plot(Date,R,'-D',zorder=2,markersize=3)

ax.yaxis.set_major_formatter(PlainOffsetScalarFormatter())
ax.ticklabel_format(axis='y', style='plain', useOffset=6378.1)
ax.set_ylabel('Mean R (km)',fontsize='small',labelpad=1)

plt.show()

【讨论】:

子类化 ScalarFormatter 确实看起来很优雅。我刚刚发现偏移量上缺少+。这可以通过添加一个条件语句来解决,该语句将其转换为字符串并在偏移量为正时在开头插入一个 +【参考方案2】:

一种方法是禁用偏移文本本身并在其中添加您的自定义ax.text,如下所示

from matplotlib import pyplot as plt
import random

plt.rcParams['font.family'] = 'monospace'

offset = 6378.1

Date = range(10)
R = [offset+10*random.random() for i in range(10)]

fig, ax = plt.subplots(figsize=(9,6))
ax.plot(Date,R,'-D',zorder=2,markersize=3)
ax.ticklabel_format(axis='y', style='plain', useOffset=offset)
ax.set_ylabel('Mean R (km)',fontsize='small',labelpad=1)

ax.yaxis.offsetText.set_visible(False)
ax.text(x = 0.0, y = 1.01, s = str(offset), transform=ax.transAxes)
plt.show()

【讨论】:

以上是关于将 matplotlib 偏移表示法从科学改为普通的主要内容,如果未能解决你的问题,请参考以下文章

matplotlib colorbar:需要在bar顶部使用指数强制科学记数法

抑制 matplotlib 中的科学记数法 offsetText

我可以在 matplotlib 条形图中关闭科学记数法吗?

使用 Matplotlib 在 x 轴上的月份名称偏移

Python科学计算——检包络与去包络

科学计算可视化