python – 理解matplotlib顶点

我正在尝试在matplotlib中为散点图创建自定义标记,其中标记是具有固定高度和不同宽度的矩形.每个标记的宽度是y值的函数.我尝试使用
this code作为模板,并假设如果给出了一个N 2-D元组的列表,它会绘制具有相应第一个值的宽度和第二个值的高度的矩形(可能这已经错了,但是那怎么办呢?)

我有一个x和y值列表,每个值包含以度为单位的角度.然后,我计算每个标记的宽度和高度

field_size = 2.
symb_vec_x = [(field_size / np.cos(i * np.pi / 180.)) for i in y]
symb_vec_y = [field_size for i in range(len(y))]

并构建顶点列表并绘制所有内容

symb_vec = list(zip(symb_vec_x, symb_vec_y))
fig = plt.figure(1, figsize=(14.40, 9.00))
ax = fig.add_subplot(1,1,1)
sc = ax.scatter(ra_i, dec_i, marker='None', verts=symb_vec)

但结果图是空的,但没有错误信息.任何人都可以告诉我在定义顶点时做错了什么以及如何正确操作?
谢谢!

最佳答案 如上所述’marker =’无’需要删除,然后指定带有顶点的矩形的适当方式就像

verts = list(zip([-10.,10.,10.,-10],[-5.,-5.,5.,5]))
ax.scatter([0.5,1.0],[1.0,2.0], marker=(verts,0))

顶点定义为([x1,x2,x3,x4],[y1,y2,y3,y4]),因此必须注意哪些得到减号等.

这个(verts,0)在文档中提到

For backward compatibility, the form (verts, 0) is also accepted,
but it is equivalent to just verts for giving a raw set of vertices
that define the shape.

但是我发现只使用verts并没有给出正确的形状.

要使过程自动化,您需要执行类似的操作

v_val=1.0
h_val=2.0
verts = list(zip([-h_val,h_val,h_val,-h_val],[-v_val,-v_val,v_val,v_val]))

基本示例:

import pylab as py
ax = py.subplot(111)
v_val=1.0
h_val=2.0
verts = list(zip([-h_val,h_val,h_val,-h_val],[-v_val,-v_val,v_val,v_val]))
ax.scatter([0.5,1.0],[1.0,2.0], marker=(verts,0))

*

编辑

个别标记

因此,您需要为每个案例手动创建一个顶点.这显然取决于您希望矩形如何逐点变化.这是一个例子

import pylab as py
ax = py.subplot(111)


def verts_function(x,y,r):
    # Define the vertex's multiplying the x value by a ratio
    x = x*r
    y = y
    return [(-x,-y),(x,-y),(x,y),(-x,y)]

n=5
for i in range(1,4):
    ax.scatter(i,i, marker=(verts_function(i,i,0.3),0))
    py.show()

所以在我的简单情况下,我绘制点i,i并在它们周围绘制矩形.指定vert标记的方式不直观.在the documentation,它描述如下:

verts: A list of (x, y) pairs used for Path vertices. The center of
the marker is located at (0,0) and the size is normalized, such that
the created path is encapsulated inside the unit cell.

因此,以下是等效的:

vert = [(-300.0, -1000), (300.0, -1000), (300.0, 1000), (-300.0, 1000)]
vert = [(-0.3, -1), (0.3, -1), (0.3, 1), (-0.3, 1)]

例如,他们将产生相同的标记.因此我使用了比率,这是你需要做的工作. r(比率)的值将改变哪个轴保持不变.

这一切都变得非常复杂,我敢肯定必须有更好的方法来做到这一点.

点赞