pythonでグラフを描くのによく使われるmatplotlibですが、
同時に横軸を決めるnumpyもちゃんと理解しないと、
このようにガッタガタのグラフができたりします。
あなたのグラフもガッタガタになっていませんか??
こちらはsinのグラフです。
控え目にみてもsinには見えませんね…
ただ、あることをするだけでこれくらい滑らかにすることができます。
滑らかにする方法は非常に単純ではありますが、
見落としやすいところでもあるので注意が必要です。
それでは実際に対策方法について解説していきます。
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程度でもこれくらいの滑らかさは出せます。
0.1でも問題なく滑らかですよね。
さすがに0.5だとまだカクカクしてますから、
0.1くらいが妥当かなと思います。
最後に、刻み幅がデフォルトの時と、0.1の時で、
グラフを重ねてみてみましょう。
オレンジがデフォルト(刻み幅の指定なし)です。
その差は一目両全ですね。
一応念のため、このグラフを描きたいこともあるかと思うので、
ソースコードはこちらに書いておきます。
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の中に対処法があるんじゃないか?
なんて調べても解決しない。という罠でしたので
今回ご紹介してみました。
コメント
多くの人はsin波とか簡単なものではなく実データをプロットする。
線形補完とかするコードが欲しかった。
3次元散布図の記事では実際にランダムに生成した座標をプロットしていますが、
2次元ということでいうと確かにもう少し実データに寄せたほうがよかったかもしれませんね。