Python Matplotlib:还显示次要记号的标签

Python Matplotlib:还显示次要记号的标签,python,matplotlib,plot,axis-labels,Python,Matplotlib,Plot,Axis Labels,在matplotlib中,当我在一个轴上使用log刻度时,该轴可能会出现无主刻度,只有次刻度。因此,这意味着整个轴不显示标签 如何指定我还需要小刻度的标签 我试过: plt.setp(ax.get_xticklabels(minor=True), visible=True) 。。。但这并没有奏效 您可以在相应的轴上使用set_minor_tickformatter: from matplotlib import pyplot as plt from matplotlib.ticker impo

matplotlib
中,当我在一个轴上使用
log
刻度时,该轴可能会出现无主刻度只有次刻度。因此,这意味着整个轴不显示标签

如何指定我还需要小刻度的标签

我试过:

plt.setp(ax.get_xticklabels(minor=True), visible=True)

。。。但这并没有奏效

您可以在相应的轴上使用
set_minor_tickformatter

from matplotlib import pyplot as plt
from matplotlib.ticker import FormatStrFormatter

axes = plt.subplot(111)
axes.loglog([3,4,7], [2,3,4])
axes.xaxis.set_minor_formatter(FormatStrFormatter("%.2f"))
plt.xlim(1.8, 9.2)
plt.show()

我已经尝试了很多方法来让小刻度在日志图中正常工作。如果您对显示刻度值的日志感到满意,则可以使用。我记得我试过,但我不太喜欢:如果我记得很清楚的话,它会把所有东西都放在
base^exp
(也是0.1,0,1)。在这两种情况下(以及所有其他
matplotlib.ticker.LogFormatter*
),您必须设置
labelOnlyBase=False
,以获得较小的刻度

我最终创建了一个自定义函数并使用它。我的方法假设刻度为整数值,并且您需要以10为基数的日志

from matplotlib import ticker
import numpy as np

def ticks_format(value, index):
    """
    get the value and returns the value as:
       integer: [0,99]
       1 digit float: [0.1, 0.99]
       n*10^m: otherwise
    To have all the number of the same size they are all returned as latex strings
    """
    exp = np.floor(np.log10(value))
    base = value/10**exp
    if exp == 0 or exp == 1:   
        return '${0:d}$'.format(int(value))
    if exp == -1:
        return '${0:.1f}$'.format(value)
    else:
        return '${0:d}\\times10^{{{1:d}}}$'.format(int(base), int(exp))

subs = [1.0, 2.0, 3.0, 6.0]  # ticks to show per decade
ax.xaxis.set_minor_locator(ticker.LogLocator(subs=subs)) #set the ticks position
ax.xaxis.set_major_formatter(ticker.NullFormatter())   # remove the major ticks
ax.xaxis.set_minor_formatter(ticker.FuncFormatter(ticks_format))  #add the custom ticks
#same for ax.yaxis

如果不删除主刻度并使用
subs=[2.0,3.0,6.0]
主刻度和次刻度的字体大小不同(这可能是由于使用
text.usetex:False
在我的
matplotlibrc
中造成的)

我认为值得一提的是matplotlib版本2.0()中引入的“次_阈值”选项。它是类LogFormatter的一对(子集,全部)形式的参数,允许您指定何时应显示次要标签的(固定)子集以及何时应显示所有次要标签(在底部解释这意味着什么)

在以下代码中,我通过使用相同的参数值(本例中为(2,0.4))但更改x轴的限制来显示效果:

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

fig, axes = plt.subplots(4, figsize=(12, 24))

dt = 0.01
t = np.arange(dt, 20.0, dt)

# first plot doesn't use a formatter
axes[0].semilogx(t, np.exp(-t / 5.0))
axes[0].set_xlim([0, 25])
axes[0].grid()

xlims = [[0, 25], [0.2, 8], [0.6, 0.9]]

for ax, xlim in zip(axes[1:], xlims):
    ax.semilogx(t, np.exp(-t / 5.0))
    formatter = LogFormatter(labelOnlyBase=False, minor_thresholds=(2, 0.4))
    ax.get_xaxis().set_minor_formatter(formatter)
    ax.set_xlim(xlim)
    ax.grid()

plt.show()
这将导致以下绘图:


您可以看到,第二行中的标签与第一行中的标签相同,在第一行中,我们没有使用格式化程序。这是因为视图范围的日志大于2(参数对的第一个值),或者换句话说,视图跨越的范围大于两个主标签之间的范围。在第三行中视图小于2但大于0.4(参数对的第二个值),因此我们可以看到次要标签的子集。最后,在最后一行中,视图在两个主要标签之间的间距不到0.4,因此显示了所有的次要标签。

不要介意我的投票结果,这是对问题的严重误读。如果图形上没有主要的对数刻度,则可能不应该使用对数刻度。@tcaswell这不是真的:如果您有一个接近幂律的函数(可能具有一些小特性),则您希望在小范围内也使用对数刻度。然后在对数图中,主刻度是10的幂,所以你可以有一个范围[2000,9000],没有主刻度,这就是我所想的。我可以将数千个点集中在一个不接近10次方的值周围(几乎没有分散),并且仍然希望对X轴应用对数刻度。@FrancescoMontesano如果[2000,9000]的范围不到十年,我会先验地怀疑基于该范围数据的任何幂律主张。换句话说,如果你只有不到十年的数据,那么使用对数刻度你能得到什么?@tcaswell:我不是在说任何幂律声明(我用幂律作为你可能想要用对数刻度绘制的东西的例子)。我只是说,在某些情况下,你想要用相对较小的范围绘制一个对数图,并且可能出现一个或没有大刻度的情况。在这两种情况下,最好有一些小的勾号。这个函数是获得对数勾号标签良好格式的极好方法!棒极了!