Julia早引きノート［23］JuliaでのMatplotlibによるグラフ描画

###JuliaでのMatplotlibによるグラフ描画(書き方例)

```ruby:note23
◆Matplotlibの宣言
　using PyPlot

◆グラフの種類
　# 折れ線グラフ
　plot(x1, y1, color="m", marker="o", markerfacecolor="r",
　　linestyle="-", label=raw"$\sin(x)$")

　# 棒グラフ
　bar(x, y, tick_label=label)

　# ヒストグラム
　hist(data)

　# 散布図
　scatter(x, y)

　# 円グラフ
　pie(data, labels=label)


◆グラフの装飾
　# グラフのタイトル
　title("Title of Graph")

　# x軸の名前
　xlabel("name of x-axis")

　# y軸の名前
　ylabel("name of y-axis")

　# グリッド線の描画
　grid(true)

　# ラベルにTeXを使用する("..."部分にTeX記載)
　raw"$ ... $"

　# グラフの保存(png,pdf,jpg,svgなど)
　savefig("graph_pic.png")


◆グラフの装飾(折れ線グラフの例)
　# 線の色(b：青, g：緑, r：赤, c：シアン, m：マゼンタ, y：黄色, k：黒, w：白)
　plot(x, y, color="b")

　# マーカーの種類(o：円, s：四角形, p：五角形, *：星形, +：プラス記号, D：ダイアモンド)
　plot(x, y, marker="o")

　# マーカーの色
　plot(x, y, markerfacecolor="r")

　# 線の種類("-"：実践, "--"：破線, "-."：破線(点入り), ":"：点線)
　plot(x, y, linestyle="-")

　# x軸目盛の設定
　x_position = [1, 2, 3, ...]
　x_ticks_name = ["first", "second", "third", ...]
　xticks(x_position, x_ticks_name)

　# 凡例
　plot(x, y, label="凡例表示文字")
　legend()

　# 描画範囲の指定
　# 上限・下限のどちらかを設定しない場合はnothingを設定
　xlim(0, π)
　ylim(0, nothing)


◆サブプロット(複数グラフ表示)
　# サブプロット関数を呼び出し(下例は2行2列の場合)
　fig, axes = subplots(2, 2)

　# グラフの設定
　ax = axes[row, col]
　ax.plot(x, y)

　# サブプロット間の間隔の設定(重ならないように調整)
　fig.tight_layout()

　# サブプロット間の間隔を指定
　plt.subplots_adjust(left=0.125, ...)
　　left　…　図の幅と高さの割合
　　right　…　図の幅と高さの割合
　　top　…　図の幅と高さの割合
　　bottom　…　図の幅と高さの割合
　　wspace　…　軸の幅と高さの割合
　　hspace　…　軸の幅と高さの割合

　# サブプロットの間隔を自動的に調整(subplots()メソッド内に記載)
　subplots(2, 2, constrained_layout=true)
```


##解説

Juliaでは、Pythonと同様のMatplotlibパッケージを使用してグラフの描画ができます。
これにより、Matplotlibの機能のほとんどを利用することができます。


####(1)PyPlot.jlのインストール

Matplotlibパッケージを利用するには、予めPythonのインストール及びMatplotlibのインストールが必要です。

PythonでMatplotlibをインストールするには、以下のようにコマンドを実行します。
` pip install matplotlib `

次に、JuliaでPyPlotパッケージをインストールします。
これに際しては、パッケージ管理モードでインストールを行います。

Juliaの対話型実行環境で角括弧文字の ] を押下してパッケージモードにします。
` add PyPlot `と入力してパッケージをインストールします。

以下のようにインストールが実行されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/88fc7e63-ccb9-fc28-a046-4cbd480264be.png)


####(2)グラフの描画

以下では、実際にグラフを描画します。

**①Matplotlibの宣言**

Matplotlibを使用する前に、以下のように宣言をしておきます。
Pythonではimportにあたります。
` using PyPlot `



**②グラフにデータをプロットする(折れ線グラフ)：plot()**

グラフ上にマーカをプロットして折れ線グラフを描画するには、` plot() `メソッドを使用します。

```ruby:graph01
using PyPlot

# xを0から2πまでの範囲で0.1ずつ増える配列とする
x = range(0, 2π, step=0.1)
y = []

# yの値をsin(x)とする
for i in x
    push!(y, sin(i))
end

# グラフ描画(x-y座標上にプロット)
plot(x, y)
```

実行結果は以下となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/86180ad4-ca07-a97c-5b47-805bede003f9.png)

**③グラフを装飾する(共通編)**

グラフのタイトルやグリッド線などを設定することができます。

:small_blue_diamond:**グラフのタイトル：title()**
　グラフのタイトルは以下で設定します。
　` title("Title of Graph") `

:small_blue_diamond:**x軸の名前：xlabel()**
　x軸の名前を設定します。
　` xlabel("name of x-axis") `

:small_blue_diamond:**y軸の名前：ylabel()**
　y軸の名前を設定します。
　` ylabel("name of y-axis") `

:small_blue_diamond:**グリッド線の描画：grid()**
　グラフにグリッド線を設定します。
　` grid(true) `

:small_blue_diamond:**ラベルにTeXを使用する**
　上記のタイトルや軸の名前にはTeX記法を使用することができます。
　TeXで記載するには「raw"$...$"」と書いて、"..."の部分にTeXを記載します。
　` raw"$\sin(x) \; and \; \frac{1}{2}\cos(x) $" `

:small_blue_diamond:**グラフの保存：savefig()**
　グラフを画像として保存します(png,pdf,jpg,svgなど)。
　` savefig("graph_pic.png") `


**④グラフを装飾する(折れ線グラフ)**

折れ線グラフ(plot)についての様々なグラフの装飾機能を解説します。
折れ線グラフ以外でも使用できるものもあります。

:small_blue_diamond:**線色：color**
　グラフの線の色を設定します。
　` plot(x, y, color="b") `
　色は以下の文字列で設定できます。
　　"b"：青
　　"g"：緑
　　"r"：赤
　　"c"：シアン
　　"m"：マゼンタ
　　"y"：黄色
　　"k"：黒
　　"w"：白

:small_blue_diamond:**マーカーの種類：marker**
　グラフのマーカーの種類を設定します。
　` plot(x, y, marker="o") `
　マーカーは以下の文字列で設定できます。
　　"o"：円
　　"s"：四角形
　　"p"：五角形
　　"*"：星形
　　"+"：プラス記号
　　"D"：ダイアモンド

:small_blue_diamond:**マーカーの色：markerfacecolor**
　マーカーの色を設定します。
　` plot(x, y, markerfacecolor="r") `
　色の設定の文字列は、線色の説明部分と同じです。

:small_blue_diamond:**線の種類：linestyle**
　グラフの線の種類を設定します。
　` plot(x, y, linestyle="-") `
　線の種類は以下の文字列で設定できます。
　　"-"：実線
　　"--"：破線
　　"-."：破線(点入り)
　　":"：点線

:small_blue_diamond:**x軸目盛の設定：xticks**
　x軸の目盛の表示内容を設定します。
　x_positionで目盛を設定する位置を配列で設定します。
　` x_position = [...] `
　x_ticks_nameで目盛に表示する内容を配列で設定します。
　` x_ticks_name = [...] `
　x軸目盛上にラベルを配置します。
　` xticks(x_position, x_ticks_name) `

:small_blue_diamond:**凡例：legend()**
　グラフに凡例を表示します。
　凡例に表示する内容は、plot()内にlabelとして設定します。
　` plot(x, y, label="凡例表示文字") `
　グラフに凡例を表示するための設定は以下となります。
　` legend() `

これまでの設定によるグラフの表示例は以下です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/55655ac0-32a4-bee1-8219-95bb8eb7a070.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/1196a796-18e3-90de-e9ed-824c19f443e0.png)
:small_blue_diamond:**描画範囲の指定：xlim(), ylim()**
　グラフの描画範囲を設定します。
　描画範囲の上限・下限それぞれの値を引数に設定します。
　上限・下限のどちらかを設定しない場合はnothingを設定します。
　` xlim(0, π) `
　` ylim(0, nothing) `
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/b32548f2-df3c-bfae-2d95-36ae02ca7085.png)

**⑤棒グラフを描画する：bar()**

棒グラフを描画するには、` bar() `メソッドを使用します。

```ruby:graph02
using PyPlot

x = [1, 2, 3, 4, 5]
y = [12, 40, 32, 37, 20]

label = ["Orange","Banana","Melon","Apple","Kiwi"]

# 棒グラフ
bar(x, y, tick_label=label)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/3ea39d01-8d1d-d431-8432-670c8b5c7081.png)

**⑥グラフを装飾する(棒グラフ)**

棒グラフ(bar)についてのグラフの装飾機能を解説します。

:small_blue_diamond:**ラベル：tick_label**
　グラフのラベルを設定します。
　ラべルとして表示する文字列を配列で用意し、この配列をbar()メソッド内に設定します。
　` label = [...] `
　` bar(x, y, tick_label=label) `
　※この設定は上掲の棒グラフ表示例のソース部分(graph02)内にも記載してあります。

**⑦ヒストグラムを描画する：hist()**

ヒストグラムを描画するには、` hist() `メソッドを使用します。
以下は100個の乱数(正規分布)をヒストグラムで表示する例です(乱数のため、毎度同じものにはなりません)。

```ruby:graph03
using PyPlot

data = randn(100)

# ヒストグラム
hist(data)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/230c98d5-f5ac-2b99-a3c0-f2a65e90fe05.png)

**⑧散布図を描画する：scatter()**

散布図を描画するには、` scatter() `メソッドを使用します。
以下は100個の乱数を生成し、散布図に表示する例です(乱数のため、毎度同じものにはなりません)。

```ruby:graph04
using PyPlot

x = randn(100)
y = randn(100)

# 散布図
plt.scatter(x, y)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/b4da24eb-0124-2f79-dc59-dd632656a226.png)

**⑨円グラフ：pie()**

円グラフを描画するには、` pie() `メソッドを使用します。

```ruby:graph05
using PyPlot

data = [50, 30, 10, 5, 3, 2]

label = ["Potato", "Cabbage", "Cucumber", "Ginger", "Eggplant", "Spinach"]

# 円グラフ
pie(data, labels=label)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/a4048440-3076-9412-abc8-8aa780bd652b.png)

**⑩グラフを装飾する(円グラフ)**

円グラフ(pie)についてのグラフの装飾機能を解説します。

:small_blue_diamond:**ラベル：labels**
　円グラフのラベルを設定します。
　ラべルとして表示する文字列を配列で用意し、この配列をpie()メソッド内に設定します。
　` label = [...] `
　` pie(data, labels=label) `
　※この設定は上掲の円グラフ表示例のソース部分(graph05)内にも記載してあります。


**⑪グラフのサブプロット表示**

Juliaでは、複数のグラフを表示する機能であるサブプロットの使用も可能です。
サブプロットによる表示において、複数のグラフを暗黙的に順次追加設定して表示する方法もありますが、ここではsubplots関数を使用して、フィギュア(**figure**)とアクシス(**axis**)の2つのオブジェクトを取得し、これらに対してグラフの描画設定を行う方法を解説します。

:small_blue_diamond:**figureとaxisを取得する**
　figureとaxisを取得するにはサブプロット関数のsubplots()メソッドを呼び出します。
　` fig, axes = subplots(x, y) `
　xはサブプロット表示のグラフの行数、yはグラフの列数を設定します。
　グラフを2行3列に表示するには、subplots(2, 3)と設定します。
　axisは指定した行列数を持つ変数となります。

:small_blue_diamond:**axisにグラフを設定する**
　取得したaxisのそれぞれにグラフを設定します。
　折れ線グラフを描画する場合は以下のように設定します。
　` ax.plot(x, y) `

:small_blue_diamond:**サブプロット間の間隔の設定**
　サブプロット同士が重ならないように調整します。
　` fig.tight_layout() `
　サブプロット間の間隔を指定するには以下を実行します。
　` plt.subplots_adjust(left=0.125, ...) `
　"..."の部分では、以下の項目の設定が可能です。
　　left　…　図の幅と高さの割合
　　right　…　図の幅と高さの割合
　　top　…　図の幅と高さの割合
　　bottom　…　図の幅と高さの割合
　　wspace　…　軸の幅と高さの割合
　　hspace　…　軸の幅と高さの割合

　サブプロットの間隔を自動的に調整します。
　` constrained_layout=true `
　これを設定するには、subplots()メソッド内に記載します。
　` subplots(2, 2, constrained_layout=true) `

これらのサブプロットの設定によるグラフの表示例は以下です。

```ruby:graph06
using PyPlot

# xを0から2πまでの範囲で0.1ずつ増える配列とする
x = range(0, 2π, step=0.1)
y = [[], [], [], []]

# 4つのグラフy[1]～y[4]のyの値を設定する
for i in x
    push!(y[1], sin(i))
    push!(y[2], cos(i))
    push!(y[3], i * 2)
    push!(y[4], 1 / i)
end


# サブプロット関数を呼び出し、figとaxesを取得する
# グラフの数は縦二つ、横二つ配置する
fig, axes = subplots(2, 2, constrained_layout=true)

# 複数のグラフから、横方向(行)→縦方向(列)の順にグラフを指定しアクシス(ax)を取得する。
# axに対してグラフの設定(plot)を行う。
i = 0
for row in 1:2, col in 1:2
    i += 1
    ax = axes[row, col]
    ax.plot(x, y[i])
end

fig.tight_layout()
plt.show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/937bdaf4-8cdd-41f6-e492-a3c3feab70bd.png)

以上、Matplotlibを使用したグラフの描画の代表例を解説しました。
JuliaのPyPlotパッケージの機能はこれ以外にもありますので、さらなる詳細は以下のマニュアルなどをご参照下さい。

　:paperclip: PyPlotドキュメント
　https://docs.juliaplots.org/latest/generated/pyplot/


##もくじ
[Julia早引きノート［01］変数・定数の使い方](https://qiita.com/ttabata/items/a1ada2c0cba03672e105)
[Julia早引きノート［02］算術式、演算子](https://qiita.com/ttabata/items/90900d0914fa317f652d)
[Julia早引きノート［03］複素数]
(https://qiita.com/ttabata/items/225c77a4d71fafc3e482)
[Julia早引きノート［04］正規表現](https://qiita.com/ttabata/items/8b6e4a2b7c2ca299de03)
....
<details><summary>もくじを開く</summary><div>
[Julia早引きノート［05］if文]
(https://qiita.com/ttabata/items/4f0bcff1e32f60402dfb)
[Julia早引きノート［06］ループ処理]
(https://qiita.com/ttabata/items/2a53825101b0b75fb589)
[Julia早引きノート［07］try, catch, finally]
(https://qiita.com/ttabata/items/1d6fe990526c99b65b5f)
[Julia早引きノート［08］変数の型(Int, Float, Bool, Char, String)]
(https://qiita.com/ttabata/items/2b84a826e39bfe432b62)
[Julia早引きノート［09］関数 (1)基本編]
(https://qiita.com/ttabata/items/d9b4f2728ec0dbcc6394)
[Julia早引きノート［10］関数 (2)応用編]
(https://qiita.com/ttabata/items/462e216c43d519f1969d)
[Julia早引きノート［11］Nothing型]
(https://qiita.com/ttabata/items/0e5a6b21968d8752cf0b)
[Julia早引きノート［12］複合型(Composite Type)型]
(https://qiita.com/ttabata/items/27469216a3c33101c825)
[Julia早引きノート［13］タプル]
(https://qiita.com/ttabata/items/ebe35dbfec4efbc1c29a)
[Julia早引きノート［14］リスト(Array型一次元配列)]
(https://qiita.com/ttabata/items/7528863ccbb282e8260d)
[Julia早引きノート［15］辞書(dictionary)]
(https://qiita.com/ttabata/items/77a4f1d02b51d067bfb7)
[Julia早引きノート［16］集合]
(https://qiita.com/ttabata/items/ca8137922a785122037e)
[Julia早引きノート［17］多次元配列 (1)初期化]
(https://qiita.com/ttabata/items/01fecbd14363460a27a6)
[Julia早引きノート［18］多次元配列 (2)様々な演算や関数]
(https://qiita.com/ttabata/items/f35896a5fa005fba7fbc)
[Julia早引きノート［19］多次元配列 (3)サブ配列]
(https://qiita.com/ttabata/items/045c00406fe45270b42e)
[Julia早引きノート［20］ファイル入出力]
(https://qiita.com/ttabata/items/5a99c3998060d161ace8)
[Julia早引きノート［21］JSON、XMLファイルの入出力]
(https://qiita.com/ttabata/items/65ebec11830271f9be71)
[Julia早引きノート［22］Python関数やPythonモジュールの呼び出し]
(https://qiita.com/ttabata/items/3afc8cef40d1e98a7b17)
[Julia早引きノート［23］JuliaでのMatplotlibによるグラフ描画]
(https://qiita.com/ttabata/items/96a0e172addfac690cca)
[Julia早引きノート［24］CSVFiles(DataFrameとの連携)]
(https://qiita.com/ttabata/items/51446731a703b5aca524)
[Julia早引きノート［25］線形代数演算(ベクトル・行列計算)]
(https://qiita.com/ttabata/items/5abe14d5c510e8ca0f54)
(※引き続きコンテンツを増やしていきます)
</div></details>


##関連情報

:paperclip: Julia - 公式ページ
https://julialang.org/

:paperclip: Julia - 日本語公式ドキュメント
https://julia-doc-ja.readthedocs.io/ja/latest/index.html

:paperclip: 初めてのJuliaとインストール (Windows & Linux)
https://qiita.com/ttlabo/items/b05bb43d06239f968035

:paperclip: Julia - Mathematics
https://docs.julialang.org/en/v1/base/math/


##ご意見など

ご意見、間違い訂正などございましたらお寄せ下さい。