2012-01-25 31 views
7

Tôi có một ứng dụng mà tôi có một con số với 9 ô lô biểu đồ (3x3) và tôi muốn cho phép người dùng chọn một trong các biểu đồ và mở một ứng dụng nhỏ wx Python cho phép chỉnh sửa và phóng to trên ô phụ được chỉ định.Matplotlib: Lấy một subplot từ nhiều Subplots

Có thể lấy tất cả thông tin từ ô phụ đã chọn, tức là nhãn trục, định dạng trục, đường, kích thước đánh dấu, nhãn đánh dấu, v.v ... và vẽ nhanh trên canvas của ứng dụng wx không?

Giải pháp hiện tại của tôi quá dài và cồng kềnh, vì tôi chỉ làm lại cốt truyện mà người dùng chọn. Tôi đã suy nghĩ một cái gì đó như thế này, nhưng nó không hoạt động hoàn toàn đúng.

#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() 

Có cách nào để lưu thuộc tính từ getp (ax) sang biến và sử dụng thuộc tính đã chọn của biến đó với setp (ax) để tạo biểu đồ mới không? Tôi cảm thấy dữ liệu này phải được truy cập bằng cách nào đó, được đưa ra một cách nhanh chóng như thế nào nó in khi bạn gọi getp (rìu), nhưng tôi thậm chí không thể lấy mã sau đây để làm việc trên một trục với hai y trục:

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

Tôi có cảm giác điều này là không thể, nhưng tôi nghĩ tôi sẽ hỏi bất cứ điều gì.

Trả lời

4

Thật không may, nhân bản một trục hoặc chia sẻ nghệ sĩ giữa nhiều trục là khó khăn trong matplotlib. (Không hoàn toàn không thể, nhưng việc làm lại cốt truyện sẽ đơn giản hơn.)

Tuy nhiên, điều gì tương tự như sau?

Khi bạn nhấp chuột trái vào một âm mưu phụ, nó sẽ chiếm toàn bộ con số, và khi bạn nhấp chuột phải, bạn sẽ "thu nhỏ" để hiển thị phần còn lại của ô phụ ...

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

Tôi đoán rằng nếu câu trả lời không dễ tìm, có lẽ là một giải pháp khó. Cảm ơn ý tưởng này; nó chắc chắn là một con đường khác để thử. – hotshotiguana

+0

Tôi thích ý tưởng này, tuy nhiên, có một vấn đề với việc khôi phục bố trí ban đầu trong các phiên bản matplotlib gần đây. Ô được thu phóng không quay trở lại kích thước ban đầu của nó. – languitar

+0

@languitar - Nó hoạt động tốt với tôi với 'v1.4.3'. (Lưu ý rằng ví dụ này hiện được viết để chỉ trở về kích thước ban đầu của nó trên một nhấp chuột phải, không phải một nhấp chuột trái khác.) Bạn đang gặp phải vấn đề gì? –

Các vấn đề liên quan