python - 在 matplotlib 中为散点图提供旋转的更快方法?
问题描述
目前,我使用以下内容绘制一组旋转线(地质走向指标)。但是,即使只有少量的罢工(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)
解决方案
在这里,您可以创建 5000 个单独的散点图。那肯定是低效的。您可以使用我在此答案中提出的解决方案,即将各个标记设置为 a 的路径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)
结果几乎是一样的,这个图的好处是只用了大约 80 毫秒,这又比PathCollection
.
推荐阅读
- python - 如何从 python pygam.LinearGAM 中提取截距参数
- jenkins - Artifactory Jenkins插件下载命令不遵守规范中的构建信息
- sql - 如何遍历 SQL Server 中的选定数据?
- amazon-web-services - 如何通过代理集成从 API Gateway 调用 AWS Lambda
- php - 使用 PHP 插入目标的 Google Analytics API
- rename - 为什么 Coq 在归纳中重命名变量?
- php - 如何修复来自 FPDF 的奇怪字符串结果?
- python - 用每行的索引重新排列 2d numpy 数组的每一行
- flutter - 启动时初始屏幕显示不正确
- java - Generate summary of execution time of unit tests and integration tests in maven