我正在尝试使用对数缩放的轴绘制宽范围,但我想显示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
感谢您的帮助!
答案 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()
<小时/> 更新:使用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。因此,最初的解决方案更通用。