Matplotlib自定义标记路径

时间:2018-04-12 08:02:22

标签: python matplotlib marker

我正在尝试使用Path实例在Matplotlib中创建自定义标记,如下所示: https://matplotlib.org/api/markers_api.html#module-matplotlib.markers

import matplotlib.pyplot as plt
import matplotlib as mpl

x = [1, 2, 3, 4]
y = [1, 4, 9, 6]

custommarker = mpl.path.Path([[0,0],[1,1],[1,0]],[1,2,2])
plt.plot(1.5,0,marker=custommarker)

plt.plot(x, y, 'ro')
plt.subplots_adjust(bottom=0.15)
plt.show()

当我运行代码时,我收到错误:

TypeError: 'Path' object does not support indexing

在mpl 1.3.x中,这是有效的但是从mpl 2.x.x开始我得到了这个错误。 谁能帮我? 非常感谢。

1 个答案:

答案 0 :(得分:1)

从您的代码生成的完整错误消息中可以看出,错误位于实际markers.py函数中的函数set_marker中。正如ImportanceOfBeingErnest in the comments所指出的,这实际上是一个已经修复但仍未发布的错误(截至目前为12月12日),正如markers.py的当前主版本中所示。

引发错误的代码如下:

if (isinstance(marker, np.ndarray) and marker.ndim == 2 and
        marker.shape[1] == 2):
    self._marker_function = self._set_vertices
elif (isinstance(marker, Sized) and len(marker) in (2, 3) and
        marker[1] in (0, 1, 2, 3)):
    self._marker_function = self._set_tuple_marker

直到某个elif之后才会执行isinstance(marker,Path)的检查。

一种解决方法是触发第一个if,以避免最终执行marker[1]。此条件检查具有与路径对象的顶点一致的维度的numpy数组,而不是传递custommarker,传递其顶点:

plt.plot(1.5,0,marker=custommarker.vertices)

另一个选项是避免第二个if使用不同的长度作为标记,因为只有len(marker) in (2,3)会出错:

custommarker = mpl.path.Path([(0,0),(1,1),(1,0),(1,0)],[1,2,2,79]) # Or a 0 as final code if instead o closing the line should stop there.

两种解决方法都给出了相同的结果。