2015-07-14 15 views
7

Tôi đang sử dụng pyplot để hiển thị biểu đồ đường lên đến 30 dòng. Tôi muốn thêm một cách để hiển thị nhanh và ẩn từng dòng trên biểu đồ. Pyplot không có một menu, nơi bạn có thể chỉnh sửa thuộc tính dòng để thay đổi màu sắc hoặc phong cách, nhưng nó khá khó khăn khi bạn muốn ẩn dòng để cô lập một trong những bạn quan tâm. Lý tưởng nhất, tôi muốn sử dụng hộp kiểm trên chú giải để hiển thị và ẩn các dòng. (Tương tự như hiển thị và ẩn các lớp trong trình chỉnh sửa hình ảnh như Paint.Net) Tôi không chắc chắn nếu điều này là có thể với pyplot, vì vậy tôi mở cho các mô-đun khác miễn là chúng có phần dễ phân phối.Ẩn các đường sau khi hiển thị một hình chóp

+0

Chỉ cần để làm giàu cho câu hỏi của bạn, bạn có thể tìm thấy loại hành vi (chọn dòng sẽ hiển thị trên biểu đồ bằng cách nhấp vào phụ đề chú giải) trong gnuplot, ví dụ: http://gnuplot.sourceforge.net/demo_svg_5.0/simple.html Tôi không chắc bạn sẵn sàng thay đổi từ pyplot sang công cụ khác như thế nào (gnuplot) , nhưng nếu bạn muốn theo kịp với python và sử dụng gnuplot thì có giao diện 'gnuplot.py'. – David

+0

Đây chính là chức năng mà tôi đang tìm kiếm. Tôi sẽ đào sâu vào nó và xem nó sẽ hoạt động tốt như thế nào với chương trình của tôi. – sommerjj

+0

Cập nhật: Tôi từ bỏ gnuplot. Nó không hoạt động tốt cho tôi. – sommerjj

Trả lời

13

Nếu muốn, bạn có thể kết nối cuộc gọi lại với chú thích sẽ hiển thị/ẩn các dòng khi chúng được nhấp. Có một ví dụ đơn giản ở đây: http://matplotlib.org/examples/event_handling/legend_picking.html

Đây là ví dụ "phù hợp" cần hoạt động mà không cần phải chỉ định mối quan hệ của dòng và điểm đánh dấu theo cách thủ công (Cũng có thêm một vài tính năng).

import numpy as np 
import matplotlib.pyplot as plt 

def main(): 
    x = np.arange(10) 
    fig, ax = plt.subplots() 
    for i in range(1, 31): 
     ax.plot(x, i * x, label=r'$y={}x$'.format(i)) 

    ax.legend(loc='upper left', bbox_to_anchor=(1.05, 1), 
       ncol=2, borderaxespad=0) 
    fig.subplots_adjust(right=0.55) 
    fig.suptitle('Right-click to hide all\nMiddle-click to show all', 
       va='top', size='large') 

    interactive_legend().show() 

def interactive_legend(ax=None): 
    if ax is None: 
     ax = plt.gca() 
    if ax.legend_ is None: 
     ax.legend() 

    return InteractiveLegend(ax.legend_) 

class InteractiveLegend(object): 
    def __init__(self, legend): 
     self.legend = legend 
     self.fig = legend.axes.figure 

     self.lookup_artist, self.lookup_handle = self._build_lookups(legend) 
     self._setup_connections() 

     self.update() 

    def _setup_connections(self): 
     for artist in self.legend.texts + self.legend.legendHandles: 
      artist.set_picker(10) # 10 points tolerance 

     self.fig.canvas.mpl_connect('pick_event', self.on_pick) 
     self.fig.canvas.mpl_connect('button_press_event', self.on_click) 

    def _build_lookups(self, legend): 
     labels = [t.get_text() for t in legend.texts] 
     handles = legend.legendHandles 
     label2handle = dict(zip(labels, handles)) 
     handle2text = dict(zip(handles, legend.texts)) 

     lookup_artist = {} 
     lookup_handle = {} 
     for artist in legend.axes.get_children(): 
      if artist.get_label() in labels: 
       handle = label2handle[artist.get_label()] 
       lookup_handle[artist] = handle 
       lookup_artist[handle] = artist 
       lookup_artist[handle2text[handle]] = artist 

     lookup_handle.update(zip(handles, handles)) 
     lookup_handle.update(zip(legend.texts, handles)) 

     return lookup_artist, lookup_handle 

    def on_pick(self, event): 
     handle = event.artist 
     if handle in self.lookup_artist: 
      artist = self.lookup_artist[handle] 
      artist.set_visible(not artist.get_visible()) 
      self.update() 

    def on_click(self, event): 
     if event.button == 3: 
      visible = False 
     elif event.button == 2: 
      visible = True 
     else: 
      return 

     for artist in self.lookup_artist.values(): 
      artist.set_visible(visible) 
     self.update() 

    def update(self): 
     for artist in self.lookup_artist.values(): 
      handle = self.lookup_handle[artist] 
      if artist.get_visible(): 
       handle.set_visible(True) 
      else: 
       handle.set_visible(False) 
     self.fig.canvas.draw() 

    def show(self): 
     plt.show() 

if __name__ == '__main__': 
    main() 

Điều này cho phép bạn nhấp vào mục chú giải để bật/tắt nghệ sĩ tương ứng của họ. Ví dụ, bạn có thể đi từ này:

enter image description here

Để này:

enter image description here

+1

Đây chính là chức năng mà tôi đang tìm kiếm! Tôi đã cố gắng tìm cách giải quyết kỳ lạ như sử dụng GUI Tkinter với các hộp kiểm đã vẽ lại biểu đồ mỗi lần thay đổi được thực hiện cho các lựa chọn. Điều này là dễ dàng hơn nhiều – sommerjj

+0

Nhưng nó vẫn hiển thị truyền thuyết của các lô ẩn! – hbaromega

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