为了账号安全,请及时绑定邮箱和手机立即绑定

在matplotlib中为散点图提供旋转的更快方法?

在matplotlib中为散点图提供旋转的更快方法?

慕尼黑的夜晚无繁华 2021-11-16 10:43:15
目前我使用以下内容来绘制一组旋转线(地质走向指标)。但是,即使只有适度的罢工(5000),这部分代码也需要很长时间。每个点都有一个独特的旋转。有没有办法给 matplotlib 一个带有旋转的列表,并且比这样一个一个地旋转更快地执行绘图?sample=#3d-array of points(x,y,theta) where theta is an amount I want to rotate the points by.    for i in range(len(sample.T)):        t = matplotlib.markers.MarkerStyle(marker='|')        t._transform = t.get_transform().rotate_deg(sample[2,i])        plt.scatter(sample[0,i],sample[1,i],marker=t,s=50,c='0',linewidth=1)
查看完整描述

1 回答

?
慕姐8265434

TA贡献1813条经验 获得超2个赞

在这里,您可以创建 5000 个单独的散点图。那肯定是低效的。您可以使用我在此答案中提出的解决方案,即将各个标记设置为PathCollection. 这将类似于散点图,并m为标记提供额外的参数。


import numpy as np

import matplotlib.pyplot as plt

import matplotlib.markers as mmarkers


def 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 sc



np.random.seed(42)

data = np.random.rand(5000,3)

data[:,2] *= 360


markers = []

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)

//img1.sycdn.imooc.com//61931ae00001772a05680411.jpg

结果几乎相同,这个图的好处是只需要大约 80 毫秒,这又是PathCollection.


查看完整回答
反对 回复 2021-11-16
  • 1 回答
  • 0 关注
  • 411 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信