2016-07-22 12 views
0

私が望むようにプロットの書式を設定する単純なPython matplotlibプロットクラスを作成しようとしています。これを行うには、クラスとサブクラスを使用しています。親は軸と図形を生成し、私が望むすべての軸のプロパティを設定します。 childは、プロット自体(散布図、線など)を生成し、プロットを出力ファイルに保存します。ここでPython継承継承親でプロットプロパティを設定した後にプロットを作成するのに適している

は(プロット自体はthis codeに基づいています)私はこの質問の目的のために出ているものです:

import matplotlib.pyplot as plt 
import numpy as np 

class myplot(): 

    def __init__(self,dims,padd): 
     self.fig = plt.figure(figsize=(8.5, 11)) 
     self.ax = self.fig.add_axes(dims) 
     self.pad = padd 

    def ax_prop(self): 
     self.ax.set_axisbelow(True) 
     self.ax.tick_params(axis='x', pad=self.pad, which='both') 

class plotter(myplot): 
    def __init__(self,dims,padd,x,y): 
     myplot.__init__(self,dims,padd) 
     self.x = x 
     self.y = y 

    def mk_p(self): 
     self.ax.plot(self.x, self.y, linestyle = '-') 
     plt.savefig('Outfile.png', facecolor=self.fig.get_facecolor(), dpi = 300) 
     plt.show() 

if __name__ == "__main__": 
    x = np.arange(0.0, 2.0, 0.01) 
    y = np.sin(2*np.pi*x) 
    propr = [0.60, 0.2, 0.2, 0.25]; padding =5 
    plt_instance = myplot(propr,padding) 
    plt_instance.ax_prop() 
    pl_d = plotter(propr,padding,x,y) 
    pl_d.mk_p() 

私は次のようにこれをベースに抱き合わせている:

The child must have all the properties of the parent. 

したがって、childクラスplotter()は継承しなければなりません:

ax, and all its customized properties 
fig 
親( myplot())クラスからの

。以下はChildクラスに変更することができる: - 等散布、線、

  • プロットのタイプの任意のプロパティ - プロットの

    1. タイプ等markersizelinestyle

    しかしmatplotlib数字と軸のオブジェクト(figax)は、数字の入力セットをプロットする前に常に必要になります。

    質問:

    これは、Pythonの継承の正しい使い方ですかこの場合、余分な子クラスがありますか?もしそうなら、サブクラスの推論がオブジェクト指向プログラミングと一貫していない場所がありました(私はこれを自信を持って納得させることができません)。

  • +1

    Figureを作成する関数とそれを描画する2番目の関数を作成するだけではどうですか。一般的には、構成から継承を選ぶべきです。継承は、 "is a"な関係を意味するはずです。 「プロッタ」は「マイプロット」ですか? –

    +0

    いいえ、それはありません。うん、それは私の質問にかなり答える。 –

    +0

    返事をありがとう。基本的にここで説明しました。私はこのコンセプトを理解していませんでした。 –

    答えて

    1

    あなたのサブクラスがLiskov Substitution Principleに違反していることが主な問題だと思います。ソリッド原理の素敵な写真についてはhereもご覧ください。 plotterのメソッドの署名が異なるため、のインスタンスをplotterに置き換えることはできません。基本クラスではなくサブクラスで代用できるはずです。署名が異なるため、署名できません。

    +0

    はい、今すぐ入手できます。私はそれを完全に逃したばかりです。ありがとう。 –

    +0

    基本クラスの機能を拡張する子クラスは、LSPに違反しません。 –

    +0

    @ ZacCrites:あなたは正しいです。私は推論を修正しました(彼のサブクラスは依然としてLSPの原則に違反していますが、私が元々与えた理由ではありません)。 – Gerrat

    1

    可能な限り、継承を優先する必要があります。私はプロットを作成する関数を作成し、それを描画する関数を作成します。

    def create_plot(dims, pad): 
        fig = plt.figure(figsize=(8.5, 11)) 
        ax = fig.add_axes(dims) 
        ax.set_axisbelow(True) 
        ax.tick_params(axis='x', pad=pad, which='both') 
        return fig 
    
    def draw_plot(fig, x, y, outfile): 
        fig.axes[0].plot(x, y, linestyle='-') 
        plt.savefig(outfile, facecolor=fig.get_facecolor(), dpi=300) 
        plt.show() 
    
    if __name__ == '__main__': 
        x = np.arange(0.0, 2.0, 0.01) 
        y = np.sin(2 * np.pi * x) 
        dims = [0.60, 0.2, 0.2, 0.25] 
        padding = 5 
    
        outfile = 'Outfile.png' 
        fig = create_plot(dims, padding) 
        draw_plot(fig, x, y, outfile) 
    
    関連する問題