LogFormatter标记科学格式限制

时间:2017-05-11 19:21:36

标签: matplotlib format

我正在尝试使用对数缩放的轴绘制宽范围,但我想显示10 ^ { - 1},10 ^ 0,10 ^ 1仅为0.1,1,10。ScalarFormatter将更改一切都是整数而不是科学符号,但我希望大多数的tickmark标签是科学的;我只是想改变一些标签。所以MWE是

import numpy as np
import matplotlib as plt
fig = plt.figure(figsize=[7,7])
ax1 = fig.add_subplot(111)
ax1.set_yscale('log')
ax1.set_xscale('log')
ax1.plot(np.logspace(-4,4), np.logspace(-4,4))
plt.show()

我希望每个轴上的中间标签读取0.1,1,10而不是10 ^ { - 1},10 ^ 0,10 ^ 1

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

设置set_xscale('log')时,您使用LogFormatterSciNotation(而不是ScalarFormatter)。如果恰好标记为刻度,则可以将LogFormatterSciNotation子类化为返回所需的值0.1,1,10

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

class CustomTicker(LogFormatterSciNotation):
    def __call__(self, x, pos=None):
        if x not in [0.1,1,10]:
            return LogFormatterSciNotation.__call__(self,x, pos=None)
        else:
            return "{x:g}".format(x=x)


fig = plt.figure(figsize=[7,7])
ax = fig.add_subplot(111)
ax.set_yscale('log')
ax.set_xscale('log')
ax.plot(np.logspace(-4,4), np.logspace(-4,4))

ax.xaxis.set_major_formatter(CustomTicker())
plt.show()

enter image description here

<小时/> 更新:使用matplotlib 2.1,现在有一个new option

  

指定格式为LogFormatterMathtext的标量的最小值
  LogFormatterMathtext现在包括指定格式化为标量的最小值指数的选项(即0.001而不是10-3)。

这可以通过使用rcParams(plt.rcParams['axes.formatter.min_exponent'] = 2)完成如下:

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['axes.formatter.min_exponent'] = 2

fig = plt.figure(figsize=[7,7])
ax = fig.add_subplot(111)
ax.set_yscale('log')
ax.set_xscale('log')
ax.plot(np.logspace(-4,4), np.logspace(-4,4))

plt.show()

这导致与上面相同的图。

但请注意,此限制是对称的,不允许仅设置1和10,但不能设置为0.1。因此,最初的解决方案更通用。