【问题标题】:Matplotlib: axis ticks number format - engineering notationMatplotlib:轴刻度数字格式 - 工程符号
【发布时间】:2019-11-06 08:35:03
【问题描述】:

背景

可以按照here 的建议将轴刻度转换为科学格式。

数字可以转换为工程格式,一次一个,如图here

问题

如何在工程符号中格式化轴刻度,即数量级是 3 的倍数。

【问题讨论】:

  • 您需要编写自己的格式化程序,混合使用ScalarFormatterEngFormatter。或者,您可以将其打包到自定义函数中并使用FuncFormatter

标签: python matplotlib formatting


【解决方案1】:

您可能想准确解释“工程符号”的含义,但有一个EngFormatter,它会自动使用国际单位制单位前缀(即微、毫、千克、兆等)

fig, ax = plt.subplots()
ax.set_ylim(0,1e6)
ticker = matplotlib.ticker.EngFormatter(unit='')
ax.yaxis.set_major_formatter(ticker)

【讨论】:

  • 我正在寻找一种解决方案,该解决方案将显示轴刻度的数量级,例如 10**-3、10**+3 而不是 m、k 表示法。谢谢。
【解决方案2】:

使用decimal 模块,我想出了以下解决方案:

from decimal import Decimal
import matplotlib.pyplot as plt
import numpy as np

data1 = np.linspace(-9, 9, 19)
data2 = 2.3 * 10**data1

yticks = 10**(np.linspace(-9, 9, 19))
yticklabels = [Decimal(y).quantize(Decimal('0.0000000001')).normalize().to_eng_string() for y in yticks]

plt.figure(1)
plt.subplot(121)
plt.grid(True)
plt.xlabel('k')
plt.ylabel('10^k')
plt.plot(data1, data2, 'k.')
plt.yscale('log')
plt.xticks(data1)
plt.yticks(yticks)
plt.subplot(122)
plt.grid(True)
plt.xlabel('k')
plt.ylabel('10^k')
plt.plot(data1, data2, 'k.')
plt.yscale('log')
plt.xticks(data1)
plt.yticks(yticks, yticklabels)
plt.show()

请参考accepted answer on your second linked Q&A0-6 之间的指数未按定义/标准转换为所需的格式。此外,我还需要使用decimal 中的quantize 方法,否则输出的数字将不得不有很多位置。 (删除quantize 部分,您就会明白我的意思。)

希望有帮助!

【讨论】:

    【解决方案3】:

    也许 ScalarFormatter(而不是 EngFormatter)可以完成这项工作。

    【讨论】:

      猜你喜欢
      • 2017-08-13
      • 2014-03-22
      • 1970-01-01
      • 2015-09-29
      • 2013-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多