2013-03-08 6 views
5

Der Versuch, Beobachtungen zu zeichnen bzw. zu mehreren Skalen pro Beobachtung habe ich es geschafft, die folgende Handlung zu produzieren:Matplotlib eine spezifische Zecke hinzufügen Achse max präsentiert - mehrere Skalen Einzelbeobachtung

enter image description here

aber ich möchte zu fügen Sie ein Häkchen hinzu, das den y-max-Wert in jeder Skala darstellt, unabhängig von der Lücke zwischen ihm und dem vorherigen Tick. Ein Beispiel für eine solche Darstellung ist unten dargestellt. Es wird erzeugt, wenn das y-max ein Vielfaches des Ticking-Intervalls ist.

enter image description here

Danke, F.

Hier ist der Code verwendet, um diese beispielsweise zu produzieren.

import numpy as np 
import pylab as pl 
import matplotlib as plt 
import matplotlib.ticker as ticker 
import matplotlib.transforms 

def add_scales(fig, axes, scales, subplot_reduction_factor=0.1, margin_size=50): 
    nb_scales = len(scales) 
    b,l,w,h = zoom_ax.get_position().bounds 

    _, ymax = axes.get_ylim() 

    # Saves some space to the right so that we can add our scales 
    fig.subplots_adjust(right=1-(subplot_reduction_factor)*nb_scales) 

    for (n, (vmin, vmax, color, label, alignment)) in enumerate(scales): 

     # Adjust wrt. the orignial figure's scale 
     nax = fig_zoom.add_axes((b,l,w,(h * alignment)/ymax)) 
     nax.spines['right'].set_position(('outward', -40+n*margin_size)) 
     nax.set_ylim((vmin,vmax)) 

     # Move ticks and label to the right 
     nax.yaxis.set_label_position('right') 
     nax.yaxis.set_ticks_position('right') 

     # Hides everything except yaxis 
     nax.patch.set_visible(False) 
     nax.xaxis.set_visible(False) 
     nax.yaxis.set_visible(True) 
     nax.spines["top"].set_visible(False) 
     nax.spines["bottom"].set_visible(False) 

     # Color stuff 
     nax.spines['right'].set_color(color) 
     nax.tick_params(axis='y', colors=color) 
     nax.yaxis.set_smart_bounds(False) 
     #nax.yaxis.label.set_color(color) 

     if label != None: 
      nax.set_ylabel(None) 

if __name__ == '__main__': 

    a=(np.random.normal(10,5,100)) 

    a=np.linspace(0,100,100) 
    c=np.linspace(0,80, 100) 
    d=np.linspace(0,40,100) 


    fig_zoom = plt.pyplot.figure() 
    zoom_ax = fig_zoom.add_subplot(1,1,1) 


    zoom_ax.plot(a,c) 
    zoom_ax.plot(a,d) 
    zoom_ax.set_title('Zoom') 
    zoom_ax.set_xlabel('A') 
    zoom_ax.set_ylabel('B') 
    zoom_ax.set_ylim((0,100)) 
    zoom_ax.grid() 
    add_scales(fig_zoom, 
       zoom_ax, [(0,.55,'green',None,40), 
          (0,.85,'blue',None,80)]) 

    fig_zoom.savefig(open('./test.svg','w'),format='svg') 

Antwort

4

Sie können den höchsten Ytick-Wert auf Ihr Maximum setzen. Wenn der zweithöchste Ytick-Wert und Ihr Maximum sehr nahe beieinander liegen, könnten die Labels unübersichtlich sein.

versuchen, dies zu der Schleife hinzu:

tcks = nax.get_yticks() 
tcks[-1] = vmax 
nax.set_yticks(tcks) 

enter image description here

+0

Es funktioniert perfekt, vielen Dank. –

Verwandte Themen