2012-12-01 2 views
4

Я использую фигуру matplotlib, встроенную в графический интерфейс WxPython, чтобы представить некоторые данные. Содержание рисунка (данные отображаются) постоянно изменяется в зависимости от нажатых кнопок, ...Очистить только часть фигуры matplotlib

Данные двух типов.

1) контурные линии

self.axes.contour(x_scale_map,y_scale_map,matrix,cl,cmap=my_cmap,extent=0,matrix.shape[1]-1,0,matrix.shape[0]-1)) 

Это относительно медленно нагрузки (~ 1 сек), но не меняется очень часто.

2) В верхней части этого контура, я сюжет, например, некоторые линии

self.axes.axhline(y,color='black') 

Эти линии, очевидно, нарисованные мгновенно и часто изменяются в зависимости от того, что пользователь нажмет. В этих ситуациях ранее отрисованные линии должны исчезнуть, а новые должны появиться, а карта контура останется неизменной.

Теперь моя проблема заключается в следующем. Я не нашел способ удалить только строки, а не контур. Кажется, что единственный способ получить желаемый результат:

self.axes.clear() 

, а затем повторить как контур, так и новые линии. Но, как уже упоминалось, перезагрузка контура каждый раз медленна и, следовательно, раздражает.

Есть ли способ очистить только линии от рисунка? Я пытался использовать наложенные подзаговоры делать что-то вроде:

self.axes1 = self.fig.add_subplot(111) 
self.axes2 = self.fig.add_subplot(111) 
self.axes1.contour(...) 
self.axes2.axhline(y,color='black') 
self.axes2.clear() 

, но эта последняя строка очищает всю фигуру.

Кто-нибудь знает, как достичь желаемой функциональности? Thanks

+0

Вы можете просто повернуть линии невидимыми и прочитать оси. (Для любого художника matplotlib вы можете сделать 'artist.set_visible (False)'.) Кроме того, если вы делаете что-то, где вы можете обновлять данные существующей строки, а не добавлять новую и скрывать старую, вы должны просто обновите старый. Наличие множества скрытых исполнителей в конечном итоге начнет замедлять работу сюжета. –

+0

Привет @JoeKington, я не думал о решении проблемы так, как вы ее предлагаете. Я искал немного больше в этом направлении и нашел также следующее [Q & A] (http://stackoverflow.com/questions/4981815/how-to-remove-lines-in-a-matplotlib-plot). Другими словами, мне удалось получить все, что я хотел, используя комбинацию 'artist.set_visible (True/False)' и 'artist.remove()' вместе с 'del artist'. Спасибо – savantas

+0

@tcaswell - сделано и спасибо – savantas

ответ

4

Решение этой проблемы Q&A.

Другими словами, чтобы иметь возможность удалить строку из рисунка:

1) отслеживать линии, сохраняя свою ссылку при рисовании его:

my_line = self.axes.axhline(y,color='black') 

2) удаление затем производятся следующим образом:

my_line.remove() 
del my_line 
1

Я имел успех с проблемой, как это, используя эквивалент self.axes2.cla(), чтобы просто очистить указанную ось. В моем случае мне пришлось использовать sharex и sharey вместе с self.axes2.patch.set_aplha (0.0), чтобы сделать facecolor прозрачным и увидеть его до графика ниже.

Моя проблема теперь, хотя у меня был выборщик, определенный на графике axes1, и он, похоже, не срабатывает с существующим сюжетом.

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