如何在python中绘制300万个圆圈

时间:2015-11-11 16:44:32

标签: python memory pandas matplotlib data-visualization

我在pandas数据框中获得了许多(~3M)圈子(每个圈子都有xyod属性)的数据集。我想将它们相互映射以形象化

我以前使用较小的数据集(约15k个圆圈)完成了此操作,但现在它似乎在窒息(当我只有几十万时,内存达到了16GB)

df是数据框 pltmatplotlib.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)

有关内存效率更高的方法的任何想法吗?

2 个答案:

答案 0 :(得分:2)

在一个图中绘制所有300万个圆圈似乎不太可行。这是一个只有1000个圆圈的示例(在example by matt_s之后):

1000 circles overlapped

相反,我建议减少绘制一些合理值的圆圈数,例如: 50或100.一种方法是在数据集上运行KMeans以按坐标和直径聚类圆。下图表示100'000随机圆的聚类作为示例。这应该很容易扩展到300万个圈子。

标记的尺寸表示直径(s,缩放以适合图表),颜色表示每个聚类中心的圆圈数(c)。 YMMV

enter image description here

用于绘制第一张图表的代码(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')