如何从用markevery参数绘制的线中提取标记数据点?

时间:2018-01-27 13:27:02

标签: python matplotlib

我正在尝试使用markevery选项获取线条标记的数据坐标。我对下面代码的尝试表明,检索到的(x,y)数据包含所有原始数据值,并忽略该参数:

import numpy as np
from matplotlib import pyplot as plt

line, = plt.plot(np.arange(100)**2, marker='o', markevery=(0, 0.1))

x, y = line.get_data()
assert len(x) != 100

请注意,在这种情况下,markevery参数 - 高级索引对数据的值不适用作为替代。

当然,我可以成功使用私有效用方法lines._mark_every_path()来解决我所处理的问题。但是,还有更多,比方说,“正确”的方式吗?

1 个答案:

答案 0 :(得分:0)

markevery选项允许对一行上标记的数据点进行二次采样。标记与否的点仅在绘制线时确定。因此,没有行的属性将存储所示点的数据,因为它们可能一直在变化,具体取决于绘图的大小和限制。

解决方案确实是使用_mark_every_path复制线条的绘制行为以访问标记点的坐标。

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import lines

line, = plt.plot(np.arange(100)**2, marker='o', markevery=(0, 0.1))

tpath, affine = line._get_transformed_path().get_transformed_points_and_affine()
p = lines._mark_every_path(line.get_markevery(), 
                      tpath, affine, line.axes.transAxes)

print(len(p.vertices)) # prints 10
print(p.vertices)      # print array of points, shape (10,2)
plt.show()