我正在尝试生成一个具有多个子图的图形,其中每个子图的轴刻度标签应以相同的方式格式化。由于数字很大,以清晰的格式显示刻度标签很棘手。我喜欢详细的科学偏移量 b x 10^c 的 matplotlib 格式(参见右下图),其中显示的刻度标签 a 可以解释为 (b+a) x 10^c。
但是,我无法找到如何控制此刻度标签格式化程序的使用。在我看来,matplotlib 决定使用它非常不一致。
这是我的初始代码,它产生了后续的情节:
import matplotlib.pyplot as plt
targets = [[-167297.54344731, -167301.10372634, -167308.44207031, -167312.11313287],[-145434.59446349, -145430.40561915, -145432.73985156, -145432.6785802]]
preds = [[-167298.46656051, -167300.59898357, -167308.72554459, -167311.71904965],[-145433.43693344, -145429.41508183, -145432.73929695, -145431.94648615]]
fig, axs = plt.subplots(nrows=1, ncols=2)
# For each subplot
for i in range(2):
# make subplot square
min_max = [min(targets[i]+preds[i]), max(targets[i]+preds[i])]
offset = 2
axs[i].set_ylim(min_max[0]-offset, min_max[1]+offset)
axs[i].set_xlim(min_max[0]-offset, min_max[1]+offset)
axs[i].set_aspect("equal")
axs[i].scatter(targets[i], preds[i])
我尝试使用
matplotlib.ticker.ScalarFormatter
,它允许我获取 10^c 形式的刻度标签,而不是所需的 b x 10^c。设置 axs[i].xaxis.set_major_locator(plt.MaxNLocator(4))
似乎也会间歇性地影响是否使用所需的格式。
所以,我的问题是:如何强制使用科学记数格式为 b x 10^c 的刻度标签偏移量?
使用
matplotlib.ticker
确实可以提供解决方案。
formatter = ticker.ScalarFormatter(useOffset=True, useMathText=True)
formatter.set_scientific(True)
formatter.set_powerlimits((-3, 4)) # define when to apply scientific notation
axs[i].xaxis.set_major_formatter(formatter)
axs[i].yaxis.set_major_formatter(formatter)
powerlimits
定义哪些数字以科学计数法显示,哪些以十进制计数法显示,指的是 10 的指数。在区间之外为科学计数,在十进制以内计数。