【发布时间】:2019-11-06 08:35:03
【问题描述】:
【问题讨论】:
-
您需要编写自己的格式化程序,混合使用
ScalarFormatter和EngFormatter。或者,您可以将其打包到自定义函数中并使用FuncFormatter。
标签: python matplotlib formatting
【问题讨论】:
ScalarFormatter 和EngFormatter。或者,您可以将其打包到自定义函数中并使用FuncFormatter。
标签: python matplotlib formatting
您可能想准确解释“工程符号”的含义,但有一个EngFormatter,它会自动使用国际单位制单位前缀(即微、毫、千克、兆等)
fig, ax = plt.subplots()
ax.set_ylim(0,1e6)
ticker = matplotlib.ticker.EngFormatter(unit='')
ax.yaxis.set_major_formatter(ticker)
【讨论】:
使用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&A:0 和-6 之间的指数未按定义/标准转换为所需的格式。此外,我还需要使用decimal 中的quantize 方法,否则输出的数字将不得不有很多位置。 (删除quantize 部分,您就会明白我的意思。)
希望有帮助!
【讨论】:
也许 ScalarFormatter(而不是 EngFormatter)可以完成这项工作。
【讨论】: