【问题标题】:How to transform data to a logscale that would match matplotlib 'log' axis如何将数据转换为匹配 matplotlib 'log' 轴的对数刻度
【发布时间】:2021-09-28 10:09:35
【问题描述】:

正如https://stackoverflow.com/a/47850534 的回答所指出的,np.log(x) 与在对数刻度上绘制 x 不同。

给定(相同的)数据数组:

x = [2, 1, 76, 140, 286, 267, 60, 271, 5, 13, 9, 76, 77, 6, 2, 27, 22, 1, 12, 7, 19, 81, 11, 173, 13, 7, 16, 19, 23, 197, 167, 1]

直接绘制数据有这样的图表:

plt.plot(x)
plt.show()

使用“对数”比例如下:

plt.plot(x)
plt.xscale('log')
plt.show()

绘图 np.log(x) 做了完全不同的事情:

plt.plot(np.log(x))
plt.show()

是否有一个函数可以重新调整对数空间中的数组值,或者这需要插值之类的东西吗?

【问题讨论】:

  • 您不想在第二个示例中使用plt.yscale('log') 而不是plt.xscale('log')吗?
  • @samgiz 或者/两者都会是有用的答案。问题不在于让 matplotlib 缩放轴,而是转换数据本身。

标签: python numpy matplotlib plot


【解决方案1】:

即使您的变量被命名为x,当您绘制它时,它也会被绘制为 y 坐标。试试plt.yscale('log')

【讨论】:

    【解决方案2】:

    混淆源于您如何绘制x。首先,让我们调用数组y,因为它是 y 值:

    y = [2, 1, 76, 140, 286, 267, 60, 271, 5, 13, 9, 76, 77, 6, 2, 27, 22, 1, 12, 7, 19, 81, 11, 173, 13, 7, 16, 19, 23, 197, 167, 1]
    

    plt.plot(y) 等价于

    x = np.arange(len(y))
    plt.plot(x, y)
    

    希望你能看到这是怎么回事。如果要对 x 轴进行对数缩放,可以对 x 中的值进行对数缩放。同样对于 y 值,甚至同时是两个方向:

    fig, ax = plt.subplots(2, 3, constrained_layout=True)
    
    ax[0, 0].semilogx(x, y)
    ax[1, 0].plot(np.log(x), y)
    ax[0, 1].semilogy(x, y)
    ax[1, 1].plot(x, np.log(y))
    ax[0, 2].loglog(x, y)
    ax[1, 2].plot(np.log(x), np.log(y))
    
    ax[0, 0].set_ylabel('Scaled Axes')
    ax[1, 0].set_ylabel('Scaled Data')
    ax[0, 0].set_title('X')
    ax[0, 1].set_title('Y')
    ax[0, 2].set_title('Both')
    

    【讨论】:

    • 好的,谢谢。我这是在做我想做的事情。使用 matplotlib 来缩放数据。我可以称它为 x 或 y,它是单个数据数组,应该对应于“相等”间距(其中相等是线性或...对数)。因此,制作 matplotlib 为我进行转换的线性 x 数据点的新日志并不能解决它。我正在寻找一个映射,例如,对于系列中的每个点,日志空间中的新 y 值是多少。
    • * 我仍然认为这个答案对其他人非常有帮助
    • @001001。我从字面上回答了你的问题。对数正是您映射到日志空间的方式。这里没有问题。
    • 对不起,如果我解释得不好,或者我错过了获取数组的明显下一步。我想说的是,我只绘制“x”的原因是因为数据是一些均匀间隔的 y 值数组,因此无需使用“y”值设置自定义“x”标签。意思是,plt.plot(x) 将使用索引作为 x 中的“步长”,并将值作为“y”轴。我想转换数组的数据,以便plt.plot(x') 绘制成与我使用对数轴比例相同的图,而(据我了解)您的答案使用辅助数组进行映射?
    • @001001。不管你传入与否,x 轴都是np.arange(len(y))。如果要对 x 位置进行对数缩放,则必须将 那个 数组映射到对数空间,而不是 y
    猜你喜欢
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    • 2023-02-08
    • 2016-07-21
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    相关资源
    最近更新 更多