【问题标题】:set ticks with logarithmic scale用对数刻度设置刻度
【发布时间】:2013-01-09 21:46:24
【问题描述】:

set_xticks 似乎无法以对数比例运行:

from matplotlib import pyplot as plt
fig1, ax1 = plt.subplots()
ax1.plot([10, 100, 1000], [1,2,3])
ax1.set_xscale('log')
ax1.set_xticks([20, 200, 500])
plt.show()

有可能吗?

【问题讨论】:

    标签: matplotlib plot logarithm


    【解决方案1】:
    import matplotlib
    from matplotlib import pyplot as plt
    fig1, ax1 = plt.subplots()
    ax1.plot([10, 100, 1000], [1,2,3])
    ax1.set_xscale('log')
    ax1.set_xticks([20, 200, 500])
    ax1.get_xaxis().set_major_formatter(matplotlib.ticker.ScalarFormatter())
    

    ax1.get_xaxis().get_major_formatter().labelOnlyBase = False
    plt.show()
    

    【讨论】:

    • 您好,您能否添加一些解释以及有关此结果的图表?
    • 第二个选项将在刻度中保留对数符号,即 20 将是​​ 10^1.3
    • 如果标签与它们的数值匹配,这很好,但如果你希望它们是其他字符串怎么办?
    • 我是matplotlib.org/api/… 的忠实粉丝,它可以让您拧出函数映射值 -> 字符串。否则使用matplotlib.org/api/… + matplotlib.org/api/…
    • @tacaswell:指数符号3x10^1 等仍然存在!如何删除它?
    【解决方案2】:

    我将添加一些图并展示如何删除次要刻度:

    OP:

    from matplotlib import pyplot as plt
    
    fig1, ax1 = plt.subplots()
    ax1.plot([10, 100, 1000], [1,2,3])
    ax1.set_xscale('log')
    ax1.set_xticks([20, 300, 500])
    plt.show()
    

    要添加一些特定的刻度,正如tcaswell 指出的那样,您可以使用matplotlib.ticker.ScalarFormatter

    from matplotlib import pyplot as plt
    import matplotlib.ticker
    
    fig1, ax1 = plt.subplots()
    ax1.plot([10, 100, 1000], [1,2,3])
    ax1.set_xscale('log')
    ax1.set_xticks([20, 300, 500])
    ax1.get_xaxis().set_major_formatter(matplotlib.ticker.ScalarFormatter())
    plt.show()
    

    要删除次要刻度,您可以使用matplotlib.rcParams['xtick.minor.size']

    from matplotlib import pyplot as plt
    import matplotlib.ticker
    
    matplotlib.rcParams['xtick.minor.size'] = 0
    matplotlib.rcParams['xtick.minor.width'] = 0
    
    fig1, ax1 = plt.subplots()
    ax1.plot([10, 100, 1000], [1,2,3])
    ax1.set_xscale('log')
    ax1.set_xticks([20, 300, 500])
    ax1.get_xaxis().set_major_formatter(matplotlib.ticker.ScalarFormatter())
    
    plt.show()
    

    你可以改用ax1.get_xaxis().set_tick_params,它有同样的效果(但只修改当前轴,不像matplotlib.rcParams那样修改所有未来的数字):

    from matplotlib import pyplot as plt
    import matplotlib.ticker
    
    fig1, ax1 = plt.subplots()
    ax1.plot([10, 100, 1000], [1,2,3])
    ax1.set_xscale('log')
    ax1.set_xticks([20, 300, 500])
    ax1.get_xaxis().set_major_formatter(matplotlib.ticker.ScalarFormatter())
    
    ax1.get_xaxis().set_tick_params(which='minor', size=0)
    ax1.get_xaxis().set_tick_params(which='minor', width=0) 
    
    plt.show()
    

    【讨论】:

    • 指数符号3x10^1 等仍然存在!如何删除它?
    • @Srivatsan 查看我关于如何删除指数符号的答案
    【解决方案3】:

    最好使用np.geomspace作为xticks

    ax = sns.histplot(arr, log_scale=True)
    ax.xaxis.set_major_formatter(matplotlib.ticker.ScalarFormatter())
    ax.set_xticks( np.geomspace(1, 1500 ,15).round() )
    

    【讨论】:

      【解决方案4】:
      from matplotlib.ticker import ScalarFormatter, NullFormatter
      for axis in [ax.xaxis]:
          axis.set_major_formatter(ScalarFormatter())
          axis.set_minor_formatter(NullFormatter())
      

      这删除了指数符号

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-02
        • 1970-01-01
        • 1970-01-01
        • 2013-02-21
        • 2012-12-03
        • 2011-11-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多