我正在尝试使用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开始我得到了这个错误。 谁能帮我? 非常感谢。
答案 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.
两种解决方法都给出了相同的结果。