如何制作此 LogLog 图?

How do I make this LogLog plot?

我是 python 的新手,我正在尝试创建一个 LogLogPlot,类似于下图中的那个:

如上图所示,该图基于方程 y=x^2/(e^x +1)。

我找到了 https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.loglog.html,但它对我来说意义不大。

我也尝试了 link 中显示的代码:pyplot: loglog() with base e 并更改了“y”的表达式,但是轴是以指数形式编写的,我的目标是如图所示,用实数表示的轴。代码如下:

# Generate some data.
x = np.linspace(0, 10, 10)
y = x**2/(np.exp(x)+1)

plt.loglog(x,y, basex=np.e, basey=np.e)
plt.show()

但这并没有给我提供与上面相同的情节。

您当前的 x 轴只有 10 个值,在 0 到 10 之间的线性 space 中同样 spaced。您需要更多值,在 logspaced 中同样=33=]。例如,np.logspace(-3, 1, 100) 在 10-3 和 101.

之间创建 100 个 x 值

如果您更改 plt.loglog(x, y, basex=np.e, basey=np.e) 中的基数,轴将显示为 e 的幂次方的刻度。如果不更改底数,默认使用熟悉的 10 次方。请注意,更改底数不会更改转换,它只会更改刻度的位置。

import numpy as np
import matplotlib.pyplot as plt

x = np.logspace(-3, 1, 100)
y = x ** 2 / (np.exp(x) + 1)

plt.loglog(x, y)
plt.autoscale(enable=True, axis='x', tight=True) # optionally set a tight x-axis
plt.show()

PS:为了避免科学记数法,this post建议:

import matplotlib.ticker as ticker
plt.gca().yaxis.set_major_formatter(ticker.FuncFormatter(lambda y, _: f'{y:g}'))
plt.gca().xaxis.set_major_formatter(ticker.FuncFormatter(lambda y, _: f'{y:g}'))

或者,对更多小数也强制使用十进制表示法:

plt.gca().yaxis.set_major_formatter(
    ticker.FuncFormatter(lambda y, _: ('{{:.{:1d}f}}'.format(int(np.maximum(-np.log10(y),0)))).format(y)))