2012-01-25 2 views
7

У меня есть приложение, в котором у меня есть одна фигура с девятью сюжетными сюжетными линиями (3x3), и я хочу, чтобы пользователь мог выбрать одну из диаграмм и открыть небольшое приложение wx Python чтобы разрешить редактирование и масштабирование по указанному подзаговору.Matplotlib: Grab Single Subplot из нескольких подзаголовков

Возможно ли захватить всю информацию из выбранного поднабора, то есть осевые метки, форматирование оси, линии, размеры тиков, метки меток и т. Д. И быстро их распечатать на холсте приложения wx?

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

#ax is a dictionary containing each instance of the axis sub-plot 
selected_ax = ax[6] 
wx_fig = plt.figure(**kwargs) 
ax = wx_fig.add_subplots(111) 
ax = selected_ax 
plt.show() 

Есть ли способ, чтобы сохранить свойство от getp (ах) к переменному и использовать выбранные свойства этого переменный с ЗАД (ах), чтобы построить новую схему? Я чувствую, эти данные должны быть доступны как-то, учитывая то, как быстро он печатает при вызове getp (ах), но я даже не могу получить следующий код для работы на оси с двумя у-осей:

label = ax1.yaxis.get_label() 
ax2.yaxis.set_label(label) 

У меня такое чувство, что это невозможно, но я думал, что все равно спрошу.

ответ

4

К сожалению, клонирование оси или разделение артистов между несколькими осями затруднено в matplotlib. (Не совсем невозможно, но повторное выполнение графика будет проще).

Однако, что относительно следующего?

Когда вы щелкните левой кнопкой мыши на сюжетные, она будет занимать всю фигуру, и при нажатии правой кнопкой мыши, вы будете «уменьшить», чтобы показать остальную часть сюжетных ...

import matplotlib.pyplot as plt 

def main(): 
    fig, axes = plt.subplots(nrows=2, ncols=2) 
    for ax, color in zip(axes.flat, ['r', 'g', 'b', 'c']): 
     ax.plot(range(10), color=color) 
    fig.canvas.mpl_connect('button_press_event', on_click) 
    plt.show() 

def on_click(event): 
    """Enlarge or restore the selected axis.""" 
    ax = event.inaxes 
    if ax is None: 
     # Occurs when a region not in an axis is clicked... 
     return 
    if event.button is 1: 
     # On left click, zoom the selected axes 
     ax._orig_position = ax.get_position() 
     ax.set_position([0.1, 0.1, 0.85, 0.85]) 
     for axis in event.canvas.figure.axes: 
      # Hide all the other axes... 
      if axis is not ax: 
       axis.set_visible(False) 
    elif event.button is 3: 
     # On right click, restore the axes 
     try: 
      ax.set_position(ax._orig_position) 
      for axis in event.canvas.figure.axes: 
       axis.set_visible(True) 
     except AttributeError: 
      # If we haven't zoomed, ignore... 
      pass 
    else: 
     # No need to re-draw the canvas if it's not a left or right click 
     return 
    event.canvas.draw() 

main() 
+0

Я предполагал, что если ответ будет нелегко найти, возможно, это было трудное решение. Спасибо за эту идею; это, безусловно, еще один способ попробовать. – hotshotiguana

+0

Мне нравится эта идея, однако есть проблема с восстановлением исходного макета в последних версиях matplotlib. Увеличенный график не возвращается к исходному размеру. – languitar

+0

@languitar - Он отлично работает для меня с 'v1.4.3'. (Обратите внимание, что в настоящее время этот пример записывается только для возврата к исходному размеру по правому клику, а не по щелчку левой кнопкой мыши.) С какими проблемами вы столкнулись? –

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