2015-06-15 2 views
0

У меня возникают проблемы с обновлением списка размеров N, содержащего объекты Rectangles из matplotlib. Я сделал, я создал фиктивный прямоугольник и создал список из N фиктивных прямоугольников. Затем я хотел выполнить итерацию по циклу, чтобы изменить ширину и высоту каждого x, y индекса. Первая итерация цикла показывает, что значения менялись, но когда я повторяю один и тот же список во втором цикле, значения показывают только атрибуты, которые были оставлены на последней итерации в первом цикле (пример показан ниже).Обновление списка matplotlib.patches.Rectangle

Вот код, я работаю над:

import matplotlib.pyplot as plt 
import numpy as np 
from matplotlib.patches import Rectangle 
from matplotlib.collections import PatchCollection 

N = 5 
dummyRect = Rectangle((None, None), None, None) 
patches = [dummyRect] * N 

for i in xrange(N): 
    x0 = (int(np.random.randint(25, size = 1))) 
    y0 = (int(np.random.randint(25, size = 1))) 

    w = (int(np.random.randint(10, size = 1)) + 1) # avoiding zeroes 
    h = (int(np.random.randint(10, size = 1)) + 1) 

    print "Index: %s, x0: %s, y0: %s, w: %s, h: %s" % (i, x0, y0, w, h) 

    patches[i].set_x(x0) 
    patches[i].set_y(y0) 
    patches[i].set_width(w) 
    patches[i].set_height(h) 

    print "XY:%s, Width: %s, Height: %s" % (patches[i].get_xy(), patches[i].get_width(), patches[i].get_height()) 
    print 

print "__________________________________"  
for x in patches: 
    print "XY:%s, Width: %s, Height: %s" % (x.get_xy(), x.get_width(), x.get_height()) 

Выход:

Index: 0, x0: 9, y0: 21, w: 4, h: 3 
XY:(9, 21), Width: 4, Height: 3 

Index: 1, x0: 9, y0: 24, w: 1, h: 7 
XY:(9, 24), Width: 1, Height: 7 

Index: 2, x0: 4, y0: 23, w: 7, h: 1 
XY:(4, 23), Width: 7, Height: 1 

Index: 3, x0: 4, y0: 20, w: 3, h: 9 
XY:(4, 20), Width: 3, Height: 9 

Index: 4, x0: 2, y0: 13, w: 1, h: 9 
XY:(2, 13), Width: 1, Height: 9 

__________________________________ 
XY:(2, 13), Width: 1, Height: 9 
XY:(2, 13), Width: 1, Height: 9 
XY:(2, 13), Width: 1, Height: 9 
XY:(2, 13), Width: 1, Height: 9 
XY:(2, 13), Width: 1, Height: 9 

Как вы можете видеть, на выходе имеет значения из последней итерации в первом цикле. Кто-нибудь знает, что я делаю неправильно здесь? Эта же концепция будет работать на Java, я полагаю, но, возможно, не в Python?

Благодарим за помощь!

ответ

1

вы не создаете 5 различные прямоугольников с patches = [dummyRect] * N, но только 5 ссылками на один Rectangle (вашего dummyRect)

Вы могли бы создать 5 новых экземпляров, подобных этому

N=5 
patches = [Rectangle((None, None), None, None) for i in range(N)] 
+0

Спасибо! Это работало именно так, как я этого хотел. Спасибо за ваше время и помощь. –

+0

Для потомков: похоже, что это больше не работает (по крайней мере, на '1.5.1'), где аргумент' TypeError: float() должен быть строкой или числом 'возникает при передаче' None'. – DilithiumMatrix

2

Это почти наверняка, потому что ваш список patches содержит N копии патча жеRectangle, а не независимые патчи. Попробуйте инициализировать список с самостоятельно созданными объектами вместо ссылок на то же самый:

patches = [] 
for i in range(N): 
    patches.append(Rectangle((None, None), None, None)) 
+0

Ваше объяснение помогло мне понять, где я ошибся. Спасибо за помощь. –

Смежные вопросы