fri*_*hax 3 python scatter matplotlib
我正在尝试在matplotlib中为散点图创建自定义标记,其中标记是具有固定高度和不同宽度的矩形.每个标记的宽度是y值的函数.我尝试使用此代码作为模板,并假设如果顶点给出N个二维元组的列表,它会绘制具有相应第一个值的宽度和第二个值的高度的矩形(可能这已经错了,但那么我怎么做到这一点?).
我有一个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))]
Run Code Online (Sandbox Code Playgroud)
并构建顶点列表并绘制所有内容
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)
Run Code Online (Sandbox Code Playgroud)
但结果图是空的,但没有错误信息.任何人都可以告诉我在定义顶点时做错了什么以及如何正确操作?谢谢!
如上所述'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))
Run Code Online (Sandbox Code Playgroud)
顶点定义为([x1,x2,x3,x4],[y1,y2,y3,y4])
必须注意哪些得到减号等.
这个(verts,0)在文档中提到
为了向后兼容,表单(verts,0)也被接受,但它只相当于verts,用于给出一组定义形状的原始顶点.
但是我觉得使用只是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]))
Run Code Online (Sandbox Code Playgroud)
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))
Run Code Online (Sandbox Code Playgroud)
*
编辑
因此,您需要为每个案例手动创建一个顶点.这显然取决于您希望矩形如何逐点变化.这是一个例子
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()
Run Code Online (Sandbox Code Playgroud)
所以在我的简单情况下,我绘制点i,i并在它们周围绘制矩形.指定vert标记的方式不直观.在文档中,它描述如下:
verts
:用于路径顶点的(x,y)对列表.标记的中心位于(0,0)并且尺寸被标准化,使得所创建的路径被封装在单位单元内.
因此,以下是等效的:
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)]
Run Code Online (Sandbox Code Playgroud)
例如,他们将生产相同的标记.因此我使用了比率,这是你需要做的工作.r(比率)的值将改变哪个轴保持不变.
这一切都变得非常复杂,我敢肯定必须有更好的方法来做到这一点.