我有一个包含属性x,y的数据集,它们可以在x-y表面绘制。
最初,我使用代码
df.plot(kind='scatter', x='x', y='y', alpha=0.10, s=2)
plt.gca().set_aspect('equal')
代码非常快,数据大小约为50000.
最近,我使用了一个新的数据集,大小约为250000.散点图变慢了。
我想知道,如果这是预期的行为,我是否可以采取任何措施来提高情节速度?
答案 0 :(得分:3)
是的,确实如此。这样做的原因是散点图超过可能一千点几乎没有意义,因此没有人愿意优化它。最好为数据使用其他表示形式:
y
(或x
}范围内的x
构建一个带有DISCONNECTED FROM CLIENT
DISCONNECTED FROM CLIENT
DISCONNECTED FROM CLIENT
DISCONNECTED FROM CLIENT
DISCONNECTED FROM CLIENT
DISCONNECTED FROM CLIENT
DISCONNECTED FROM CLIENT
...(a lot)
的盒子,并将它们放在同一网格上通常效果非常好。< / LI>
答案 1 :(得分:2)
我也遇到了同样的问题,即使用降维算法获得了超过300k的2D坐标,而解决方案是近似的,可以将坐标转换为2D numpy数组并将其可视化为图像。结果非常好,而且速度更快:
def plot_to_buf(data, height=2800, width=2800, inc=0.3):
xlims = (data[:,0].min(), data[:,0].max())
ylims = (data[:,1].min(), data[:,1].max())
dxl = xlims[1] - xlims[0]
dyl = ylims[1] - ylims[0]
print('xlims: (%f, %f)' % xlims)
print('ylims: (%f, %f)' % ylims)
buffer = np.zeros((height+1, width+1))
for i, p in enumerate(data):
print('\rloading: %03d' % (float(i)/data.shape[0]*100), end=' ')
x0 = int(round(((p[0] - xlims[0]) / dxl) * width))
y0 = int(round((1 - (p[1] - ylims[0]) / dyl) * height))
buffer[y0, x0] += inc
if buffer[y0, x0] > 1.0: buffer[y0, x0] = 1.0
return xlims, ylims, buffer
data = load_data() # data.shape = (310216, 2) <<< your data here
xlims, ylims, I = plot_to_buf(data, height=h, width=w, inc=0.3)
ax_extent = list(xlims)+list(ylims)
plt.imshow(I,
vmin=0,
vmax=1,
cmap=plt.get_cmap('hot'),
interpolation='lanczos',
aspect='auto',
extent=ax_extent
)
plt.grid(alpha=0.2)
plt.title('Latent space')
plt.colorbar()
结果如下:
希望对您有帮助。