我试图在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
答案 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()