2015-07-14 15 views
7

30 satıra kadar bir çizgi grafiği görüntülemek için pyplot kullanıyorum. Grafikteki tek tek satırları hızlı bir şekilde göstermek ve gizlemek için bir yol eklemek istiyorum. Pyplot, renk veya stili değiştirmek için satır özelliklerini düzenleyebileceğiniz bir menüye sahiptir, ancak ilgilendiğiniz birini ayırmak için satırları gizlemek istediğinizde oldukça karmaşıktır. İdeal olarak, efsanedeki onay kutularını kullanmak istiyorum çizgileri göstermek ve gizlemek için. (Paint.Net gibi görüntü düzenleyicilerindeki katmanları gösterme ve gizleme gibi) Ben bunun pyplot ile mümkün olup olmadığından emin değilim, bu yüzden dağıtımı kolay oldukları sürece diğer modüllere açığım.Bir pyplot rakamı gösterdikten sonra çizgileri gizleme

+0

Sadece sorunuzu zenginleştirmek için, size bu tür davranışları bulabilirsiniz (çizgiler göstereceğini kendisi seçmek http://gnuplot.sourceforge.net/demo_svg_5.0/simple.html gnuplotta (altyazıyı tıklayarak altyazıyı tıklayarak grafiği), pyplottan başka bir araca (gnuplot) ne kadar istekli olduğunuzu bilmiyorum ama python ile devam etmek ve gnuplot kullanmak istiyorsanız bir 'gnuplot.py' arayüzü var. – David

+0

Bu tam olarak aradığım işlevselliktir. Onu kazacağım ve programımla ne kadar iyi çalışacağını göreceğim. – sommerjj

+0

Güncelleme: Ben gnuplottan vazgeçiyorum. Benim için iyi çalışmıyordu. – sommerjj

cevap

13

İsterseniz, tıklatıldığında hat gösterecek/gösterecek olan efsaneye bir geri arama bağlayabilirsiniz. Burada basit bir örnek var: http://matplotlib.org/examples/event_handling/legend_picking.html

Çizgiler ve lejant işaretlerinin ilişkisini manuel olarak belirtmeye gerek kalmadan çalışması gereken bir "meraklısı" örneği aşağıda belirtilmiştir (Ayrıca birkaç özelliği daha vardır).

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

Bu, ilgili sanatçıları açıp kapatmak için gösterge öğelerini tıklatmanıza olanak tanır. Örneğin, bundan gidebilir:

enter image description here

Bu Kime:

enter image description here

+1

Bu tam olarak aradığım işlevsellik! Seçimler için her değişiklik yapıldığında grafiği yeniden çizen onay kutularıyla bir Tkinter GUI kullanmak gibi garip çözümler bulmaya çalışıyordum. Bu çok daha kolay – sommerjj

+0

Ama yine de gizli parsellerin efsanelerini gösteriyor! – hbaromega

İlgili konular