我正在尝试在 matplotlib 中为散点图创建自定义标记,其中标记是具有固定高度和不同宽度的矩形。每个标记的宽度是 y 值的函数。我尝试这样使用 this code 作为模板,并假设如果给 verts 一个 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))]
并构建 verts 列表并绘制所有内容
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='None' 然后指定带有 verts 的矩形的适当方法类似于
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) 在文档中被提到为
但是我发现仅使用
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))
*
编辑
个人标记
所以你需要为每个案例手动创建一个vert。这显然取决于您希望矩形如何点对点更改。这是一个例子
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 并在它们周围绘制了矩形。指定顶点标记的方式是不直观的。在 the documentation 中,它的描述如下:
因此,以下内容是等效的:
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 的值(比率)将改变哪个轴保持不变。
这一切都变得非常复杂,我相信一定有更好的方法来做到这一点。
关于python - 了解 matplotlib verts,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16189928/