#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))
это должно сработать.