我在pandas数据框中获得了许多(~3M)圈子(每个圈子都有x
,y
和od
属性)的数据集。我想将它们相互映射以形象化
我以前使用较小的数据集(约15k个圆圈)完成了此操作,但现在它似乎在窒息(当我只有几十万时,内存达到了16GB)
df
是数据框
plt
为matplotlib.pyplot
ax2=plt.gca(xlim=(-.25,.25),ylim=(-0.25,0.25))
for i,row in df.iterrows():
x=row.X_delta
y=row.Y_delta
od=float(row.OD)
circle=plt.Circle((x,y),od/2,color='r',fill=False,lw=5,alpha=0.01)
ax2.add_artist(circle)
有关内存效率更高的方法的任何想法吗?
答案 0 :(得分:2)
在一个图中绘制所有300万个圆圈似乎不太可行。这是一个只有1000个圆圈的示例(在example by matt_s之后):
相反,我建议减少绘制一些合理值的圆圈数,例如: 50或100.一种方法是在数据集上运行KMeans以按坐标和直径聚类圆。下图表示100'000随机圆的聚类作为示例。这应该很容易扩展到300万个圈子。
标记的尺寸表示直径(s
,缩放以适合图表),颜色表示每个聚类中心的圆圈数(c
)。 YMMV
用于绘制第一张图表的代码(ipython)
%matplotlib inline
import pandas as pd
import numpy as np
n = 1000
circles = pd.DataFrame({'x': np.random.random(n), 'y': np.random.random(n), 'r': np.random.random(n)},)
circles.plot(kind='scatter', x='x', y='y', s=circles['r']*1000, c=circles.r * 10, facecolors='none')
用于绘制第二张图表的代码(ipython)
%matplotlib inline
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# parameters
n = 100000
n_clusters = 50
# dummy data
circles = pd.DataFrame({'x': np.random.random(n), 'y': np.random.random(n), 'r': np.random.random(n)})
# cluster using kmeans
km = KMeans(n_clusters=n_clusters, n_jobs=-2)
circles['cluster'] = pd.Series(km.fit_predict(circles.as_matrix()))
# bin by cluster
cluster_size = circles.groupby('cluster').cluster.count()
# plot, using #circles / per cluster as the od weight
clusters = km.cluster_centers_
fig = plt.figure()
ax = plt.scatter(x=clusters[:,0], y=clusters[:,1], # clusters x,y
c=cluster_size, #color
s=clusters[:,2] * 1000, #diameter, scaled
facecolors='none') # don't fill markers
plt.colorbar()
fig.suptitle('clusters by #circles, c/d = size')
plt.xlabel('x')
plt.ylabel('y')
答案 1 :(得分:1)
您是否尝试过大熊猫散点图?
import pandas as pd
import random
n = 100000
df = pd.DataFrame({'x': np.random.random(n), 'y': np.random.random(n), 'r': np.random.random(n)})
df.plot(kind='scatter', x='x', y='y', s=df['r']*1000, facecolor='none')