2016-07-12 10 views
1

Als ich Plots machen, ich brauche immer x, ylabels, Titel zu setzen, Legende usw. ihr eine Einstellung von einer langweilig, also habe ich versucht, sie in eine einzige Hilfsmethode zu setzen:Python & Matplotlib: Vereinfachte Plot-Konfiguration (Xlabel, Titel, Legende ...)?

def plt_configure(ax=None, xlabel='', ylabel='', title='', legend=False, tight=False, figsize=False): 
    if ax == None : 
     ax=plt.gca() 
     plt.suptitle(title) 
    else: 
     ax.set_title(title) 
    ax.set_xlabel(xlabel) 
    ax.set_ylabel(ylabel) 
    if legend: 
     if isinstance(legend, dict): 
      ax.legend(**legend) 
     else: 
      ax.legend() 
    if tight: 
     if tight == 'xtight' or tight == 'x': 
      ax.autoscale(enable=True, axis='x', tight=True) 
     elif tight == 'ytight': 
      ax.autoscale(enable=True, axis='y', tight=True) 
     else: 
      ax.axis('tight') 
    if figsize: 
     plt.gcf().set_size_inches(figsize) 

es also kann verwendet werden wie

# Use Case 1 
plt_configure(xlabel='Direction', ylabel='Difference with ECDF', 
       legend={'loc':'best'},figsize=(8,2.5)) 
# Use Case 2 
plt_configure(title='Direction Distribution Comparison', 
       xlabel='Direction',ylabel='Frequency', legend={'loc': 'best'} ,tight='xtight',figsize = (8,2.5)) 

Ich möchte wissen, ob es eine elegantere Möglichkeit gibt, dies zu tun? (Definieren Sie den Xlabel, Titel effizienter und dann setzen sie eins nach dem anderen)

Auch die Hilfsmethode, die ich gemacht habe, sieht ziemlich komplex und lang aus. Gibt es da eh einfach so?

Antwort

1

In ähnlicher Weise werde ich auch verwendet, um eine Hilfsfunktion für plt Setup einzurichten. Ich denke, es genügt, nur die Grundlagen einer solchen Funktion zu setzen, da der Rest immer plotabhängig ist.

Sie geraten nur in die hohe Komplexität Ihres "Helfers", weil Sie versuchen, zu viele Optionen hinzuzufügen, was die Kontrolle erschwert und weniger deutlich macht, als nur die gewünschten Optionen für jedes Diagramm direkt einzustellen.

Dies ist diejenige, die ich verwende:

def plt_setup(width=8, height=6, borders='lb', fontsize=9): 
    font = { 
     'family' : 'Roboto', 
     'weight' : 'light', 
     'size' : int(fontsize) 
    } 
    matplotlib.rc('font', **font) 

    plt.figure(figsize=(float(width), float(height))) 

    ax = plt.subplot(111) 

    for b in ['left', 'right', 'top', 'bottom']: 
     if b[0] in borders: 
      ax.spines[b].set_visible(True) 
      ax.spines[b].set_linewidth(.6) 
     else: 
      ax.spines[b].set_visible(False) 

    ax.get_xaxis().tick_bottom() 
    ax.get_yaxis().tick_left() 

Sobald die Handlung Grundlagen festgelegt sind, ich den Rest für jedes Grundstück einzeln steuern. Wenn Sie überall ähnliche Plots erstellen und die Dinge beim Schreiben von Plot-Code schlank halten möchten, sollten Sie zusätzliche Funktionen verwenden, die jeweils unterschiedliche Plottypen behandeln.

Ein sehr schwerer Start (bei weitem nicht vollständig) könnte wie folgt aussehen:

def plt_barchart(df, op=dict()): 
    plt_setup() 
    # Set options according to values in op-dict 
    # (just a few exemplary settings here...) 
    if 'title' in op.keys(): 
     plt.title(op['title']) 
    plt.xticks(df['x'].values, df['labels'].values) 
    # Get amount of bar groups 
    ycols = [k for k in df.keys().values if k not in ['x', 'labels']] 
    if 'position' in op.keys() and op['position'] == 'dodge': 
     # Calculate x offset and bar width depending on group count 
     barwidth = .8/len(ycols) 
    # ... 
+0

Nach dem Vorbild dessen, was ich in meinem Helfer tun. Kleiner Unterschied ist, dass ich den Helfer als separates Python-Modul angeordnet habe, das ich in mein Client-Skript importiere. Alle Plot-Parameter, die ich ändern möchte, habe ich als Globals (oder Sie könnten Klassenmitglieder machen, wenn Sie Globals nicht mögen). Ich habe Zugriff auf diese Parameter oder Sie können nur explizit darauf verweisen. Ich habe dann mehrere verschiedene Plot-Funktionen. Damit habe ich alle Verweise auf MATPLOTLIB aus dem Client-Code versteckt. –

+0

@PeterBingham Gibt es ein Beispiel, das ich sehen kann? – cqcn1991

+0

Das hat ein paar Probleme (ich hacks Änderungen), aber es ist mein Hilfsmodul und könnte Ihnen ein paar Ideen geben. Einige der Parameter sind globale (oben) und einige sind Funktionsparameter, aber Sie könnten alles global abhängig von Ihren Nutzungsbedürfnissen machen: https://github.com/petersbingham/ProtoQScat/blob/master/utilities/general/simpplot.py –

0

Sie verwenden, um eine for Schleife die oben zu erreichen.

Zum Beispiel lassen Sie uns sagen, dass wir drei Handlungsstränge haben und wir brauchen gemeinsame Legenden haben, Etiketten, xscale oder yscale usw.

fig2 = plt.figure(figsize=(9,10)) 

ax1 = fig2.add_subplot(131) 
ax1.scatter(data_z,data_zphot1,s=3,marker='.') 
ax1.annotate(r'$0.001\times(1+z_{c})$',xy=(0.05,0.8),xycoords=('axes fraction'),fontsize=12) 

ax2 = fig2.add_subplot(132) 
ax2.scatter(data_z,data_zphot2,s=3,marker='.') 
ax2.annotate(r'$0.005\times(1+z_{c})$',xy=(0.05,0.8),xycoords=('axes fraction'),fontsize=12) 

ax3 = fig2.add_subplot(133) 
ax3.scatter(data_z,data_zphot3,s=3,marker='.') 
ax3.annotate(r'$0.010\times(1+z_{c})$',xy=(0.05,0.8),xycoords=('axes fraction'),fontsize=12) 

for ax in [ax1,ax2,ax3]: 
    ax.set_xscale('log') 
    ax.legend(loc='best') 
    ax.set_xlim(0.0,3.5) 
    ax.set_ylim(0.0,4.5) 

So in der for Schleife durch den Aufruf der alle axes eins nach dem anderen, eine Eine gemeinsame Vorlage kann für alle Ihre Subplots erreicht werden.

Und wenn alle drei Handlungsstränge eine gemeinsame x label und y label benötigen, kann es geschehen durch:

fig2.text(0.5,0.02,'x label here',ha='center',fontsize=22) 
fig2.text(0.02,0.5,'y label here',va='center',rotation='vertical',fontsize=22) 
+0

Es tut mir leid, ich kann Sie in eine andere Richtung führen. Ich frage nur, wie man xlabel, title ... mit weniger Zeilen setzt. – cqcn1991

Verwandte Themen