微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python:具有非线性 x 轴的散点图

如何解决Python:具有非线性 x 轴的散点图

我有很多 x 值在 0 左右的数据,而当你上升到 950 左右时,只有少数 x 值,

linear scatter point of data

我想创建一个具有非线性 x 轴的图,以便可以以“直线”形式查看关系。就像在这个例子中看到的那样,

non-linear scale example

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

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

plt.scatter with log scale

我尝试使用

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

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

plt.plot graph with log scale

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,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,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()

解决方法

看起来在您的“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,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,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()

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。