Python 散点图最密集区域的打印等高线
我正在生成一个约300k数据点的散点图,并且有一个问题,即在某些地方过于拥挤,以至于看不到任何结构-所以我有一个想法 我想让绘图为最密集的部分生成一个等高线图,并用Python 散点图最密集区域的打印等高线,python,numpy,matplotlib,scipy,contour,Python,Numpy,Matplotlib,Scipy,Contour,我正在生成一个约300k数据点的散点图,并且有一个问题,即在某些地方过于拥挤,以至于看不到任何结构-所以我有一个想法 我想让绘图为最密集的部分生成一个等高线图,并用scatter()数据点保留密度较低的区域 所以我试着分别计算每个数据点的最近邻距离,然后当这个距离达到一个特定值时,画一个轮廓并填充它,然后当它达到一个更大的值(密度更小)时,只做散射 我已经尝试了几天,但失败了,我不确定传统的等高线图在这种情况下是否有效 我会提供代码,但它是如此混乱,可能只是混淆了问题。而且它的计算量非常大,如果
scatter()
数据点保留密度较低的区域
所以我试着分别计算每个数据点的最近邻距离,然后当这个距离达到一个特定值时,画一个轮廓并填充它,然后当它达到一个更大的值(密度更小)时,只做散射
我已经尝试了几天,但失败了,我不确定传统的等高线图在这种情况下是否有效
我会提供代码,但它是如此混乱,可能只是混淆了问题。而且它的计算量非常大,如果它能工作的话,我的电脑可能会崩溃
提前谢谢大家
p、 我一直在寻找答案!我确信它甚至不可能出现所有的结果
编辑:这样做的目的是查看300k样本结构中某些特定点的位置。这是一个示例图,我的点分散在三种不同的颜色中。
我将尝试从我的数据中随机抽取1000个数据点,并将其作为文本文件上传。
干杯,堆垛工。:)
编辑:嘿,
以下是一些示例数据1000行-仅两列[X,Y]
(或[g-i,i]
(来自上面的绘图)空格分隔。谢谢大家!!
您可以使用各种numpy/scipy/matplotlib工具实现这一点:
4年后,我终于可以回答这个问题了! 这可以通过使用来完成 我使用了高斯平滑,可以根据需要省略或替换
import matplotlib.colors as colors
from matplotlib import path
import numpy as np
from matplotlib import pyplot as plt
try:
from astropy.convolution import Gaussian2DKernel, convolve
astro_smooth = True
except ImportError as IE:
astro_smooth = False
np.random.seed(123)
t = np.linspace(-1,1.2,2000)
x = (t**2)+(0.3*np.random.randn(2000))
y = (t**5)+(0.5*np.random.randn(2000))
H, xedges, yedges = np.histogram2d(x,y, bins=(50,40))
xmesh, ymesh = np.meshgrid(xedges[:-1], yedges[:-1])
# Smooth the contours (if astropy is installed)
if astro_smooth:
kernel = Gaussian2DKernel(stddev=1.)
H=convolve(H,kernel)
fig,ax = plt.subplots(1, figsize=(7,6))
clevels = ax.contour(xmesh,ymesh,H.T,lw=.9,cmap='winter')#,zorder=90)
# Identify points within contours
p = clevels.collections[0].get_paths()
inside = np.full_like(x,False,dtype=bool)
for level in p:
inside |= level.contains_points(zip(*(x,y)))
ax.plot(x[~inside],y[~inside],'kx')
plt.show(block=False)
也许有人(像我一样)会在互联网上无意中寻找答案@FriskyGrub,我喜欢你的平滑方法。AstroML库中有一个解决方案,例如。我不确定您如何在代码中设置阈值(高于该阈值,将在轮廓中包含点,而不是分散),但我成功地通过以下方法重现了与您类似的结果:
import matplotlib.pyplot as plt
from astroML.plotting import scatter_contour
np.random.seed(123)
t = np.linspace(-1,1.2,2000)
x = (t**2)+(0.3*np.random.randn(2000))
y = (t**5)+(0.5*np.random.randn(2000))
fig,ax = plt.subplots(1,1,figsize=(6,6))
scatter_contour(x,y, threshold=15, log_counts=True, ax=ax,
histogram2d_args=dict(bins=15),
plot_args=dict(marker='+', linestyle='none', color='black',
markersize=5),
contour_args=dict(cmap='winter',),
filled_contour=False)
(scatter\u contour???
提供了很多文档帮助,但基本上正如kwargs所建议的,historogram2d\u args
是由numpy获取的args。historogram2d
,plt\code>是由scatterplt.plot
获取的args,contour\u args
是由plt.contour获取的args(或plt.contourf
)
祝福
Chris根据这些值的拥挤程度,您可能可以通过执行分散(x,y,alpha=0.1)
或一些合适的小值来梳理出一些结构。要执行您的建议,我将构建一个内核密度估计(请参见scipy.stats.kde
)。为什么不使用2d柱状图来显示数据?@FriskyGrub您可以提供与真实数据类型/形状/等相同的随机数据-您不必总是在第一时间发布生成真实数据的复杂步骤。这使我们更容易给出对您有用的答案。@RutgerKassies-这不是真的以有意义的方式显示该数据,并且会出现装箱问题。此外,很难在打印输出中正确表示该数据。@FriskyGrub“无法真正以有意义的方式显示该数据,并且会出现装箱问题。此外,很难在打印输出中正确表示该数据。”-这是什么意思?直方图是表示分布质量的一种完全有效的方法。绘制300000个云中每个x,y点的确切位置绝对不会有什么好处,因为这些点彼此重叠。要找到一个看起来不错的彩色地图并不难一个打印输出。我没有直接尝试过,但这基本上就是我最后做的。我求助于使用hexbin“热图”,因为我无法减少等高线的计算时间,从n^n-u-…的顺序来看,这可能是一个值得回顾的有趣问题。