PR

pythonのmatplotlibで描いたグラフがカクカクする?

python-matplotlib-bumpy-sin-eyecatch

pythonでグラフを描くのによく使われるmatplotlibですが、

同時に横軸を決めるnumpyもちゃんと理解しないと、

このようにガッタガタのグラフができたりします。

python-matplotlib-bumpy-sin
ガッタガタのsinのグラフ

あなたのグラフもガッタガタになっていませんか??

こちらはsinのグラフです。
控え目にみてもsinには見えませんね…

ただ、あることをするだけでこれくらい滑らかにすることができます。

python-matplotlib-bumpy-improved-sin
ちゃんと滑らかになったsinのグラフ

滑らかにする方法は非常に単純ではありますが、

見落としやすいところでもあるので注意が必要です。

それでは実際に対策方法について解説していきます。

この記事を読むことでわかること

自己紹介

東証一部上場企業でサラリーマンしてます。

主に工場(生産現場)で使用する検査装置のアプリケーション開発してます。

ヒトの作業を自動化して簡略化するアプリケーションを日々開発中。

2022年5月に転職。現役バリバリの技術者です。
現在は超大手企業の新規事業分野で装置の研究・開発をしています。

Youtubeチャンネルにさまざまな動画を上げています

↓↓↓こちらからYoutubeチャンネルにアクセス!! ↓↓↓

↓↓↓↓これまでのPythonの記事についてはこちら↓↓↓↓

まずはsinのグラフをmatplotlibで描くところから。

それではまず初めにmatplotlibでグラフを描くところですが、

おそらくこの記事に行きついたあなたであれば、

matplotlib自体の基本的な使い方については理解されているはずです。

なのでさらっと紹介するだけにしておきますが、

今回sinの関数をグラフに描いているのはこのソースコードです。

import matplotlib as mpl
import numpy as np
import matplotlib.pyplot as plt

axisX=np.arange(-10,10)

plt.figure(figsize=(20,6))
plt.plot(axisX,np.sin(axisX))
plt.show()

このソースコードを説明すると、

axisXという変数に、numpyのarangeを使って-10~10を格納しています。

次にプロットするグラフのサイズを指定して、

実際にプロットするX,Yを引数にいれ、

最後にshowでグラフを表示しています。

このコードだけ見ると、ガタガタのグラフになる原因はぱっと見ではわからないですよね??

さらにいうと、直線のグラフの場合、ガタガタ自体気づかないことのほうが多いです。

実際実行してもらえればわかりますが、冒頭でお見せしたガタガタのグラフになります。

ガタガタのグラフを滑らかにしたい。

さて、本題ですが、いきなり答えを出します。

このソースコードを実行してもらえれば、matplotlibで滑らかなsinのグラフが描けます。

import matplotlib as mpl
import numpy as np
import matplotlib.pyplot as plt

axisX=np.arange(-10,10,0.001)

plt.figure(figsize=(20,6))
plt.plot(axisX,np.sin(axisX))
plt.show()

さて、どこが変わったでしょうか????

実は、np.arangeの引数にこたえがあります。

実は、np.arangeの引数の-10,10,0.001の3つ目の引数がポイントです。

np.arangeの引数は、最小値、最大値(未満)、刻み幅

の順になっています。

指定しない場合はデフォルト値が入るので、入れていなくてもグラフ自体は描画されます。

この辺の話は、別記事でもご紹介しているので参考にしてもらえればと思います。

この刻み幅を指定していなかったことにより、

デフォルトで大きい数字が入る⇒グラフがガタガタになる。

というロジックだったわけです。

ですから、今回は0.001としましたが0.1程度でもこれくらいの滑らかさは出せます。

python-matplotlib-bumpy-improved-sin-01
刻み幅を0.1にしたsinのグラフ

0.1でも問題なく滑らかですよね。

さすがに0.5だとまだカクカクしてますから、

python-matplotlib-bumpy-sin-05
刻み幅0.5だとまだちょっとカクカクしている。

0.1くらいが妥当かなと思います。

最後に、刻み幅がデフォルトの時と、0.1の時で、

グラフを重ねてみてみましょう。

python-matplotlib-bumpy-sin-compared
デフォルトで描いたsinと刻み幅0.1で描いたsinの比較。

オレンジがデフォルト(刻み幅の指定なし)です。

その差は一目両全ですね。

一応念のため、このグラフを描きたいこともあるかと思うので、

ソースコードはこちらに書いておきます。

import matplotlib as mpl
import numpy as np
import matplotlib.pyplot as plt

axisX=np.arange(-10,10,0.1)
axisX2=np.arange(-10,10)

plt.figure(figsize=(20,6))
plt.plot(axisX,np.sin(axisX),label='0.1')
plt.plot(axisX2,np.sin(axisX2),label='default')
plt.legend()
plt.show()

今回のまとめ

今回は、pythonのグラフを描くmatplotlibで、

グラフがガッタガタになる場合の対処法でした。

実際のところ、いじるところはX軸側のnumpyの話ではあるのですが、

どうしてもmatplotlibの中に対処法があるんじゃないか?

なんて調べても解決しない。という罠でしたので

今回ご紹介してみました。

コメント

  1. 匿名 より:

    多くの人はsin波とか簡単なものではなく実データをプロットする。
    線形補完とかするコードが欲しかった。

    • hobbyhappy hobbyhappy より:

      3次元散布図の記事では実際にランダムに生成した座標をプロットしていますが、
      2次元ということでいうと確かにもう少し実データに寄せたほうがよかったかもしれませんね。

タイトルとURLをコピーしました