【问题标题】:Faster way to provide rotation to scatter point plots in matplotlib?在 matplotlib 中为散点图提供旋转的更快方法?
【发布时间】:2019-02-22 00:47:31
【问题描述】:

目前我使用以下内容绘制一组旋转线(地质走向指标)。但是,即使只有少量的罢工(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)

【问题讨论】:

  • 你能发布少量的样本数据吗?
  • ImportanceOfBeingErnest 展示的情节正是我所做的。数据将是三个列表或数组。 x 位置之一、y 位置之一和以度为单位的旋转之一。

标签: python matplotlib transform scatter-plot


【解决方案1】:

在这里您可以创建 5000 个单独的散点图。那肯定是低效的。您可以使用我在this answer 中提出的解决方案,即将各个标记设置为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()

如果我们对此进行计时,我们会发现创建具有 5000 个点和 5000 个不同角度的图需要大约 250 毫秒。相比之下,循环解决方案需要 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 快了三倍。

【讨论】:

    猜你喜欢
    • 2017-08-28
    • 2021-09-17
    • 2019-09-19
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 2019-08-04
    • 1970-01-01
    相关资源
    最近更新 更多