【问题标题】:Python: scatter plot with non-linear x axisPython:具有非线性 x 轴的散点图
【发布时间】:2021-09-07 21:25:13
【问题描述】:

我有很多 x 值大约为零的数据,而当你上升到大约 950 时,只有少数 x 值,

我想创建一个带有非线性 x 轴的图,以便可以以“直线”形式看到关系。如本例所示,

我尝试过使用plt.xscale('log'),但它没有达到我想要的效果。

我无法将对数刻度函数与散点图一起使用,因为它只显示 3 个值而不是存在的数千个值。

我尝试过使用

plt.plot(retper, aep_NW[y], marker='o', linewidth=0)

复制散点函数,该函数绘制但不显示我想要的。

plt.figure(1)
plt.scatter(rp,aep,label="SSI sum")
plt.show()

图 3:

plt.figure(3)
plt.scatter(rp, aep)
plt.xscale('log')
plt.show()

图 4:

plt.figure(4)
plt.plot(rp, aep, marker='o', linewidth=0)
plt.xscale('log')
plt.show()

补充: 您好,感谢您的回复。 我认为我的 x 轴被截断是对的,但我不确定为什么或如何...... 我不太确定要明智地发布代码,因为数据都很大并且来自服务器,所以不能真正给你数据来查看它。

基本上,aep_NW 是一个一维数组,有 951 个元素,值从 0 到 140,大多数值很小,只有少数值较大。该数据代表了 951 年的风暴严重程度指数。

然后我希望 x 轴成为这些值的返回周期,所以基本上我制作了一个大小相同的 rp 数组,它的值从 951 向下每次减少一半。

然后我将 aep_NW 值从最低到最高排序,最高值与最大回报值 (951) 相关联,然后是第二大 aep_NW 值与第二大回报期值 (475.5) 等相关联。

所以当我绘制它时,我需要 x 轴比例类似于您在上面显示的示例或我最初附加的第一张图像。

rp = [0]*numseas.shape[0]
i = numseas.shape[0] - 1
rp[i] = numseas.shape[0]
i = i - 1
while i != 0:
    rp[i] = rp[i+1]/2
    i = i - 1

y = np.argsort(aep_NW)
fig, ax = plt.subplots()
ax.scatter(rp,aep_NW[y],label="SSI sum")
ax.set_xscale('log')
ax.set_xlabel("Return period")
ax.set_ylabel("SSI score")
plt.title("AEP for NW Europe: total loss per entire extended winter season")
plt.show()

【问题讨论】:

    标签: python matplotlib plot scatter


    【解决方案1】:

    看起来在您的“Image 3”中,x 轴被截断,因此您看不到您感兴趣的数据。这似乎是因为您的“rp”数组中有 0。我更新了示例以显示您看到的错误,一种排除零的方法,以及一种剪裁它们并以不同比例显示它们的方法。

    import numpy as np
    import matplotlib.pyplot as plt
    %matplotlib inline
    
    n = 100
    numseas = np.logspace(-5, 3, n)
    aep_NW = np.linspace(0, 140, n)
    
    rp = [0]*numseas.shape[0]
    i = numseas.shape[0] - 1
    rp[i] = numseas.shape[0]
    i = i - 1
    while i != 0:
        rp[i] = rp[i+1] /2
        i = i - 1
    
    y = np.argsort(aep_NW)
    fig, axes = plt.subplots(1, 3, figsize=(14, 5))
    ax = axes[0]
    ax.scatter(rp, aep_NW[y], label="SSI sum")
    ax.set_xscale('log')
    ax.set_xlabel("Return period")
    ax.set_ylabel("SSI score")
    
    ax = axes[1]
    rp = np.array(rp)[y]
    mask = rp > 0
    ax.scatter(rp[mask], aep_NW[y][mask], label="SSI sum")
    ax.set_xscale('log')
    ax.set_xlabel("Return period (0 values excluded)")
    
    ax = axes[2]
    log2_clipped_rp = np.log2(rp.clip(2**-100, None))[y]
    ax.scatter(log2_clipped_rp, aep_NW[y], label="SSI sum")
    xticks = list(range(-110, 11, 20))
    xticklabels = [f'$2^{{{i}}}$' for i in xticks]
    ax.set_xticks(xticks)
    ax.set_xticklabels(xticklabels)
    ax.set_xlabel("log$_2$ Return period (values clipped to 2$^{-100}$)")
    
    plt.show()
    

    【讨论】:

    • 感谢您的回复 :) 我已尝试在上面提供更多详细信息
    • 我添加了一些希望有所帮助的编辑 - 您的数据中似乎可能存在超出对数刻度的零。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 2016-05-14
    相关资源
    最近更新 更多