Matplotlib在循环中重复绘图

时间:2017-11-25 02:14:30

标签: python matplotlib plot

我试图在for循环中绘图。 我有点数据pts字典存储点id和点坐标。字典rect存储矩形的id以及它连接的点。然后我尝试使用patches.Rectangle绘制矩形,并使用text命令将矩形的id放在其中心。在循环结束时,我正在绘制图形。但没有任何东西被绘制我不明白这里出了什么问题。有什么建议吗?

另外,我们可以使用plt.axis([xmin, xmax, ymin, ymax])代替fig.add_axes([0,0,30,30])吗?

import matplotlib.pyplot as plt
import matplotlib.patches as patches

plt.close('all')
pts={}
#defining points
pts.update({1:(0,0)})
pts.update({2:(10,0)})
pts.update({3:(10,20)})
pts.update({4:(0,20)})
pts.update({5:(30,0)})
pts.update({6:(30,20)})

#defining rectangle connecting to points
rect={}
rect.update({10:(1,2,3,4)})
rect.update({11:(2,5,6,3)})

#plotting
fig = plt.figure()
ax = fig.add_axes([0,0,30,30])
for i in rect:
    p2=rect[i]
    dx,dy = pts[p2[0]]
    wd = pts[p2[1]][0] - pts[p2[0]][0]
    ht = pts[p2[3]][1] - pts[p2[0]][1]
    midpt = [ (pts[p2[0]][0] + pts[p2[2]][0])/2, (pts[p2[0]][1] + pts[p2[2]][1])/2 ]
    #finding midpoint of points zeroth and second 
    #x_mid= (x_0+x_2)/2 and similar for y_mid
    p = patches.Rectangle((dx,dy), wd,ht,fill=False, clip_on=False)
    ax.add_patch(p)

    plt.text(midpt[0],midpt[1],i,color='k')
else:
    plt.show()  

更新

我正在使用带有else循环的for子句,这是允许的。目的是绘制for循环执行完成后的绘图。有关详细信息,请Hidden features of Python

1 个答案:

答案 0 :(得分:0)

问题在于

fig = plt.figure()
ax = fig.add_axes([0,0,30,30])

这将创建一个比每个维度中的数字大30倍的轴。因此,您只能看到1./(30*30) = 1 per mille个轴。

您可能想要做的是添加一个普通的子图,并在两个方向上将其数据范围设置为0..30

fig, ax = plt.subplots()
ax.axis([0,30,0,30])

完整示例:

import matplotlib.pyplot as plt
import matplotlib.patches as patches

plt.close('all')
pts={}
#defining points
pts.update({1:(0,0)})
pts.update({2:(10,0)})
pts.update({3:(10,20)})
pts.update({4:(0,20)})
pts.update({5:(30,0)})
pts.update({6:(30,20)})

#defining rectangle connecting to points
rect={}
rect.update({10:(1,2,3,4)})
rect.update({11:(2,5,6,3)})

#plotting
fig, ax = plt.subplots()
ax.axis([0,30,0,30])
for i in rect:
    p2=rect[i]
    dx,dy = pts[p2[0]]
    wd = pts[p2[1]][0] - pts[p2[0]][0]
    ht = pts[p2[3]][1] - pts[p2[0]][1]
    midpt = [ (pts[p2[0]][0] + pts[p2[2]][0])/2, (pts[p2[0]][1] + pts[p2[2]][1])/2 ]
    #finding midpoint of points zeroth and second 
    #x_mid= (x_0+x_2)/2 and similar for y_mid
    p = patches.Rectangle((dx,dy), wd,ht,fill=False, clip_on=False)
    ax.add_patch(p)

    plt.text(midpt[0],midpt[1],i,color='k')
else:
    plt.show()

HashTable