Обновление позиции ConnectionPatch в matplotlib

#python #matplotlib #pyqt4

#python #matplotlib #pyqt4

Вопрос:

Я использую виджет matplotlib в приложении PyQt4 с графическим интерфейсом. На рисунке я использую ConnectionPatches для того, чтобы рисовать линии. Я сохраняю ссылки на них как таковые:

 self.x_axis1 = ConnectionPatch((0, yPos), (xPos-boxWidth/2, yPos), coordsA='data', edgecolor='w', linewidth=linewidth)
self.x_axis2 = ConnectionPatch((xPos boxWidth/2, yPos), (cursorX, yPos), coordsA='data', edgecolor='w', linewidth=linewidth)
self.y_axis1 = ConnectionPatch((xPos, 0), (xPos, yPos-boxHeight/2), coordsA='data', edgecolor='w', linewidth=linewidth)
self.y_axis2 = ConnectionPatch((xPos, yPos boxHeight/2), (xPos, cursorY), coordsA='data', edgecolor='w', linewidth=linewidth)
  

…и добавьте их к рисунку обычным способом:

 self.ui.mpl_right.axes.add_patch(self.x_axis1)
self.ui.mpl_right.axes.add_patch(self.x_axis2)
self.ui.mpl_right.axes.add_patch(self.y_axis1)
self.ui.mpl_right.axes.add_patch(self.y_axis2)
  

Согласно документации matplotlib, вы можете установить их положение как таковое:

 self.x_axis1.set_positions((0, yPos), (xPos-boxWidth/2, yPos))
self.x_axis2.set_positions((xPos boxWidth/2, yPos), (cursorX, yPos))
self.y_axis1.set_positions((xPos, 0), (xPos, yPos-boxHeight/2))
self.y_axis2.set_positions((xPos, yPos boxHeight/2), (xPos, cursorY))
  

Обычно вы просто вызываете draw() на холсте рисунка, например, чтобы заставить объекты обновляться:

 self.ui.mpl_right.figure.canvas.draw()
  

…но это абсолютно ничего не дает.

В настоящее время я просто удаляю их и добавляю заново, используя remove():

 self.x_axis1.remove()
self.x_axis2.remove()
self.y_axis1.remove()
self.y_axis2.remove()
  

Есть ли какой-либо способ обновить позицию ConnectionPatch без необходимости их полного уничтожения и повторного добавления их снова?

Комментарии:

1. Меня также интересует ответ на этот вопрос.

Ответ №1:

хитрость заключается в том, чтобы использовать атрибуты ‘xy1‘ и ‘xy2‘ вместо ‘set_positions()‘, как вы это делали. Итак, если вы поместите:

 self.x_axis1.xy1 = (0, yPos)
self.x_axis1.xy2 = (xPos-boxWidth/2, yPos)
  

вместо:

 self.x_axis1.set_positions((0, yPos), (xPos-boxWidth/2, yPos))
  

это должно сработать.