静かなる名辞

pythonとプログラミングのこと


matplotlibのpcolormeshでalphaを小さくすると網目が出てくる対策

概要

 デフォルト設定だとタイトルに書いた通りの現象が起こります。網目模様が出て図が汚くなります。

実験

 こんな単純なコード。

import numpy as np
import matplotlib.pyplot as plt

def main():
    xx, yy = np.meshgrid(np.arange(0, 10, 0.1),
                         np.arange(0, 10, 0.1))
    zz = np.zeros(xx.shape)
    zz[xx < 5] = 1
    plt.pcolormesh(xx, yy, zz, alpha=0.03)
    plt.savefig("result.png")

if __name__ == "__main__":
    main()

結果1
結果1

 こんな感じで汚くなります。ちょっと人には見せられない図です。

対策

 これはシェーディングに問題があります。shading="gouraud"を指定するとよくなります。

matplotlib.axes.Axes.pcolormesh — Matplotlib 3.1.0 documentation

 また、それでも不満が残る場合はメッシュを細くすると相対的に解消されます。

 この組み合わせでちょっと(というかだいぶ)遅くなりますが、我慢しましょう。

import numpy as np
import matplotlib.pyplot as plt

def main():
    xx, yy = np.meshgrid(np.arange(0, 10, 0.02),
                         np.arange(0, 10, 0.02))
    zz = np.zeros(xx.shape)
    zz[xx < 5] = 1
    plt.pcolormesh(xx, yy, zz, 
                   alpha=0.03, shading="gouraud")
    plt.savefig("result.png")

if __name__ == "__main__":
    main()

結果2
結果2

 なんか濃さが違う気もしますが、よくなりました。濃さはalphaで調整してください。

まとめ

 これで変なダサい図を出さなくても済むようになると思います。