慕姐8265434
在这里,您可以创建 5000 个单独的散点图。那肯定是低效的。您可以使用我在此答案中提出的解决方案,即将各个标记设置为PathCollection. 这将类似于散点图,并m为标记提供额外的参数。import numpy as npimport matplotlib.pyplot as pltimport matplotlib.markers as mmarkersdef mscatter(x,y,ax=None, m=None, **kw): import matplotlib.markers as mmarkers if not ax: ax=plt.gca() sc = ax.scatter(x,y,**kw) if (m is not None) and (len(m)==len(x)): paths = [] for marker in m: if isinstance(marker, mmarkers.MarkerStyle): marker_obj = marker else: marker_obj = mmarkers.MarkerStyle(marker) path = marker_obj.get_path().transformed( marker_obj.get_transform()) paths.append(path) sc.set_paths(paths) return scnp.random.seed(42)data = np.random.rand(5000,3)data[:,2] *= 360markers = []fig, ax = plt.subplots()for i in range(len(data)): t = mmarkers.MarkerStyle(marker='|') t._transform = t.get_transform().rotate_deg(data[i,2]) markers.append(t)mscatter(data[:,0], data[:,1], m=markers, s=50, c='0', linewidth=1)plt.show()如果我们计时,我们发现这需要大约 250 毫秒来创建具有 5000 个点和 5000 个不同角度的图。相比之下,循环解决方案需要超过 12 秒。到目前为止,关于如何旋转多个标记的一般问题。对于这里的特殊情况,您似乎想使用简单的线条标记。这可以使用quiver绘图轻松完成。然后可以关闭箭头以使箭头看起来像线条。fig, ax = plt.subplots()ax.quiver(data[:,0], data[:,1], 1,1, angles=data[:,2]+90, scale=1/10, scale_units="dots", units="dots", color="k", pivot="mid",width=1, headwidth=1, headlength=0)结果几乎相同,这个图的好处是只需要大约 80 毫秒,这又是PathCollection.