【问题标题】:Plotting negative values on a non symmetric log scale在非对称对数刻度上绘制负值
【发布时间】:2020-11-18 04:46:10
【问题描述】:

我一直在尝试重现此处显示的图表: 如您所见,x 轴是一个包含负值的对数刻度。我在网上找了一些技巧。他们中的大多数处理了我不想使用的 matplotlib 的 symlog 函数,因为我试图绘制的函数仅在 ]-inf, 0[ 上定义。所以我要求另一个建议。此外,我希望 x 轴仅显示附件上的三个刻度(即 -10^0、-10^-2、-10^-4)。欢迎任何提示!谢谢!

函数代码为:

x = np.linspace(-1, -0.0001, 10000)

a = 2*np.log((1+(1-16*20*x)**0.25)/2) +np.log((1+((1-16*20*x)**0.25)**2)/2) - 2*np.arctan((1-16*20*x)**0.25) + np.pi/2

b = 2*np.log((1+(1-16*10*x)**0.25)/2) +np.log((1+((1-16*10*x)**0.25)**2)/2) - 2*np.arctan((1-16*10*x)**0.25) + np.pi/2

c = 2*np.log((1+(1-16*5*x)**0.25)/2) +np.log((1+((1-16*5*x)**0.25)**2)/2) - 2*np.arctan((1-16*5*x)**0.25) + np.pi/2

y = (np.log(20/5) - a + b)/(np.log(10/5) - c + b)

【问题讨论】:

    标签: python numpy matplotlib logging xscale


    【解决方案1】:

    您可以以对数比例绘制 y-x 并相应地格式化 xticks:

    from matplotlib.ticker import FuncFormatter
    fig, ax = plt.subplots()
    ax.plot(-x,y)
    ax.set_xscale('log')
    ax.invert_xaxis()
    ax.set_xticks([1,1e-2,1e-4])
    ax.xaxis.set_major_formatter(FuncFormatter(lambda x,pos: '$-\\mathdefault{10^{'+f'{int(np.log10(x))}'+'}}$'))
    

    输出:

    【讨论】:

    • 嗨!非常感谢你的回复!你能解释一下最后一行代码的作用吗?
    • @nalfahel 基本上刻度是1,1e-2,1e-4,最后一行代码用负值标记刻度。
    猜你喜欢
    • 2017-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    相关资源
    最近更新 更多