86521


matplotlibでグラフを作っているとxlim, ylim, xticks,
gridなどなど色々な設定を加えているためaxisの数が増えれば増えるほどコード量が長くなります。例えば

[code]

    fig = plt.figure(figsize=(11.69, 8.27), tight_layout=True)
    ax1 = fig.add_subplot(4, 2, 1)
    ax2 = fig.add_subplot(4, 2, 2)
    ax3 = fig.add_subplot(4, 2, 3)
    ax4 = fig.add_subplot(4, 2, 4)
    ax5 = fig.add_subplot(4, 2, 5)
    ax6 = fig.add_subplot(4, 2, 6)
    ax7 = fig.add_subplot(4, 2, 7)
    ax8 = fig.add_subplot(4, 2, 8)
    x = df.index
    
    ax1.scatter(x[0:2], df.iloc[0:2, [0]])
    ax1.scatter(x[0:2], df.iloc[0:2, [0]])
    ax1.set_ylim(9, 15, 3)
    ax1.set_xlim(-0.3, 0.3)
    ax1.set_xticks([0, 1])
    ax1.set_xticklabels(x[0:2])
    ax1.grid(which='major', axis='y', linestyle='--')
    ax1.grid(which='major', axis='x', linestyle='--')
    
    ax2.scatter(x[1:3], df.iloc[1:3, [0]])
    ax2.scatter(x[1:3], df.iloc[1:3, [0]])
    ax2.set_ylim(9, 15, 3)
    ax2.set_xlim(-0.3, 0.3)
    ax2.set_xticks([0, 1])
    ax2.set_xticklabels(x[1:3])
    ax2.grid(which='major', axis='y', linestyle='--')
    ax2.grid(which='major', axis='x', linestyle='--')
    以下略
    
[/code]

といったように一つグラフを作るだけでかなりの行数となり汚いなあと感じております。  
こうしたら書きやすいよ、ここは改善できそうなどご意見ありましたらお願いいたします。

補足ですが、dfのx軸にあたるところは時系列ではなく文字列です。  
何もせずにx軸に設定すると初めと終わりの目盛りが端によってしまうので、xlim, xticks, xticklabelsをつかって気持ち中央に寄せています。

よろしくお願いいたします。


CC BY-SA 4.0
2022-02-22T09:01:57.130
86515
2022-02-25T04:20:44.873
48769
question
python matplotlib
matplotlibのコード量は減らせないのか？アドバイスを頂きたいです


これは matplotlib
に限った話ではなく一般的な話として、複数の規則的なデータを扱うときには配列と繰り返しが便利です。また、似たような処理を繰り返すときには関数が便利です。

`ax1` から `ax8` までは `add_subplot` に渡す引数が規則的に異なっているだけなので、`axes`
みたいな名前の配列にまとめることができるでしょう。

またそれぞれの軸に対する微調整も、同じ処理をしている部分については関数にまとめれば簡潔になりそうです。軸個別に微調整を加えている部分があるので、すべてを関数にまとめるのではなく一部に留めた方が便利でしょう。

ただまあ、見た目の調整というのは得てして 1
回しか動かさないアドホックなスクリプトになりがちなので、そんなにメンテナンスしないコードであれば今のようなベタ書きでも個人的にはそこまで気になりません。


CC BY-SA 4.0
2022-02-22T23:55:17.473
86521
2022-02-22T23:55:17.473
19110
86515
answer


例えば

[code]

    fig, axes = plt.subplots(4, 2, figsize=(11.69, 8.27), tight_layout=True)
    
    for i, ax in enumerate(axes):
        # 共通の処理
        slicer = slice(i+0, i+2)
        ax.scatter(x[slicer], df.iloc[slicer, [0]])
        ax.set_ylim(9, 15, 3)
        ax.set_xlim(-0.3, 0.3)
        # ……
    
        # 個別の処理
        if i == 0:
            # ……
        elif i == 1:
            # ……
    
[/code]

みたいな感じですかね？


CC BY-SA 4.0
2022-02-25T04:20:44.873
86568
2022-02-25T04:20:44.873
37167
86515
answer