初心者がプログラミングを短時間で理解するための教材～python編～

# 本記事のねらい
:::note info
本記事では業務に即活用できるプログラミングスキルを短時間で取得するために書いています。また、「CSVファイルの中身を読み込んでグラフ化する」を例にプログラミングを作成する流れがわかるような構成にしています。コードについて詳しい説明はしません。とにかくコードを作って実行結果を確認するというサイクルを繰り返していくうちにいつの間にか感覚が身につくはず、と考えています。
:::
前置きはここまでにしてさっそくはじめていきましょう

## 事前準備
環境を構築しておく必要があります。本記事ではGoogle Colaboratoryを使いますが、Anacondaでも可。
・Anacondaをインストール方法は[Python 環境構築 for Windows (Anaconda + VScode)](https://qiita.com/maami415/items/c0f382fd88e1d173d288 "Python 環境構築 for Windows (Anaconda + VScode)")を参照
・Google Colaboratoryを使う場合は[Google Colabにcsvを読み込ませる方法](https://qiita.com/kame_house_0828/items/aa68ea187cf5c02b6b36 "Google Colabにcsvを読み込ませる方法")を参照

## 1：ローカルに置かれたCSVファイルをグラフ化
### 1-1：サンプルデータを作成してCSVファイルで出力
まずは準備として適当にデータを作成
```python:create_data.py
import pandas as pd #CSVを出力するために必要なライブラリをインポート
df = pd.DataFrame([[0.0,0.137,37.981,87.32],
                    [1.1,0.407,27.008,75.25],
                    [2.2,0.787,37.981,89.66],
                    [3.1,0.902,11.546,58.99],
                    [4.0,1.129,22.674,70.55],
                    [5.1,2.148,1.97,52.19],
                    [6.1,2.878,-27.009,24.01],
                    [7.2,1.658,-22.039,29.32],
                    [8.1,0.513,-14.484,35.98],
                    [9.0,1.143,-37.061,20.12],
                    [10.1,-0.327,-46.94,5.22],
                    [11.2,-0.547,-22.013,28.09],
                    [12.1,-0.841,-29.431,20.46],
                    [13.2,-0.87,-2.845,46.25],
                    [14.1,-0.924,-5.443,42.09],
                    [15.0,-0.789,13.558,65.77],
                    [16.1,-0.633,15.56,68.99],
                    [17.1,-0.279,35.357,89.44],
                    [18.2,0.194,47.347,99.98]],
                    columns=['Label1','Label2','Label3','Label4']) #任意にデータを作成する
f = r'/content/drive/MyDrive/Colab Notebooks/Qiita/test.csv' # 任意のファイルパスでOK
df.to_csv(f, index=False) #CSVを出力するコード
```

### 1-2：CSVファイルを読み込む
実際の業務では手持ちのCSVファイルデータがあるはずなので、1-1のようにCSVファイルを作成する必要はない。実質、1-2が「ローカルに置かれたCSVファイルをグラフ化」をするためのスタートである。

```python:test.py
import pandas as pd #CSVを読み込むために必要なライブラリをインポート
df = pd.read_csv(r'/content/drive/MyDrive/Colab Notebooks/Qiita/test.csv', encoding='shift_jis') # 任意のファイルパスでOK
```
うまくデータを読み込めたかを確認
```python:test.py
print(df.head(5)) # 確認のためのコードなので後で消してもOK
```
実行後、下にように表示されればOK
| Label1 | Label2 | Label3 | label4 |
|:------:|:------:|:------:|:------:|
| 0.0    | 0.137  | 37.981 | 87.32  |
| 1.1    | 0.407  | 27.008 | 75.25  |
| 2.2    | 0.787  | 37.981 | 89.66  |
| 3.1    | 0.902  | 11.546 | 58.99  |
| 4.0    | 1.129  | 22.674 | 70.55  |
### 1-3：データグラフ化する
```python:test.py
import matplotlib.pyplot as plt #グラフ化するためのライブラリをインポート
df.plot()
plt.show()
```
実行後、下のように表示されればOK
![test01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919724/80b2731d-2ef0-435d-0dd8-53998aaa1ba1.png)
簡単にグラフを作成できるが、日常業務においてこれで満足できることはあまりないでしょう。
意図したグラフを作成するには設定が必要です

## 2：グラフ化するデータを設定する
### 2-1：Label1をグラフの横軸にする
1-3の「df.plot()」を消して下のコードを貼り付けて実行してみましょう
```python:test.py
fig = plt.figure() #今はおまじないと思ってください
ax1 = fig.subplots() #今はおまじないと思ってください
ax1.plot(df['Label1'],df['Label2'])
ax1.plot(df['Label1'],df['Label3'])
plt.show()
```
実行後、下のように表示されればOK
![test02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919724/94e1ef4c-330e-246d-314c-f04e05ab2e1c.png)

### 2-2：Label1をグラフの横軸にしてLabel2を第１軸にLabel3を第２軸にする
```python:test.py
fig = plt.figure()
ax1 = fig.subplots()
ax2 = ax1.twinx() #ax1のグラフをax2のグラフに関連付け
ax1.plot(df['Label1'], df['Label2'])
ax2.plot(df['Label1'], df['Label3'])
plt.show()
```
実行後、下のように表示されればOK
![test03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919724/9fd9e5fa-531a-d863-9839-ac93b669d799.png)

### 2-3：グラフの色を設定する
2-2のグラフは同じ青色になってしまっているので色を分けます
```python:test.py
fig = plt.figure()
ax1 = fig.subplots()
ax2 = ax1.twinx()
ax1.plot(df['Label1'], df['Label2'],color='Blue')
ax2.plot(df['Label1'], df['Label3'],color='Green')
plt.show()
```
## 3：グラフの表示設定を調整する
### 3-1：表示範囲、ラベルの表示を設定する
だんだんコードが多くなり混乱しているかもしれないが、コードをまる覚えしたり理解する必要はありません。今はコードの意味は分からなくても下のようにコードを貼り付ければグラフが表示されるってことだけ知っていればいいです。

```python:test.py
fig = plt.figure()
ax1 = fig.subplots()
ax2 = ax1.twinx()
ax1.plot(df['Label1'], df['Label2'],color='Blue')
ax2.plot(df['Label1'], df['Label3'],color='Green')
ax1.set_xlim([0, 20]) #x軸の表示範囲
ax1.set_ylim([-4, 4]) #y1軸の表示範囲
ax2.set_ylim([-40, 40]) #y2軸の表示範囲
ax1.grid(True) #グリッド表示
ax1.set_title("Result")    #タイトル
ax1.set_xlabel("Time_sec")  #x軸ラベル
ax1.set_ylabel("Y1")  #y1軸ラベル
ax2.set_ylabel("Y2")  #y2軸ラベル
plt.show()
```
### 3-2：凡例を表示させる
```python:test.py
fig = plt.figure()
ax1 = fig.subplots()
ax2 = ax1.twinx()
ax1.plot(df['Label1'], df['Label2'],color='blue', label='The label2') #ラベル名を追記
ax2.plot(df['Label1'], df['Label3'],color='green', label='The label3') #ラベル名を追記
ax1.set_xlim([0, 20])
ax1.set_ylim([-4, 4])
ax2.set_ylim([-40, 40])
ax1.grid(True)
ax1.set_title('Result')
ax1.set_xlabel('Time_sec')
ax1.set_ylabel('Y1')
ax2.set_ylabel('Y2')
h1, l1 = ax1.get_legend_handles_labels() #ax1のラベル取得
h2, l2 = ax2.get_legend_handles_labels() #ax2のラベル取得
ax1.legend(h1+h2, l1+l2 ,loc='lower right') #グラフ右下に凡例を表示
plt.show()
```
実行後、下のように表示されればOK
だんだん業務に活用できそうなグラフとなってきました
![test04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919724/cf7f6cd9-f9d8-d959-554a-e9c0224b9c07.png)
### ブレイク
いったんここまでのコードの全貌を書いておきます
```python:test.py
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv(r'/content/drive/MyDrive/Colab Notebooks/Qiita/test.csv', encoding='shift_jis')
fig = plt.figure()
ax1 = fig.subplots()
ax2 = ax1.twinx() #２軸グラフを作成するためのおなじない
ax1.plot(df['Label1'], df['Label2'],color='blue', label='The label2')
ax2.plot(df['Label1'], df['Label3'],color='green', label='The label3')
ax1.set_xlim([0, 20]) #x軸の表示範囲
ax1.set_ylim([-4, 4]) #y1軸の表示範囲
ax2.set_ylim([-40, 40]) #y2軸の表示範囲
ax1.grid(True) #グリッド表示
ax1.set_title('Result')    #タイトル
ax1.set_xlabel('Time_sec')  #x軸ラベル
ax1.set_ylabel('Y1')  #y1軸ラベル
ax2.set_ylabel('Y2')  #y2軸ラベル
h1, l1 = ax1.get_legend_handles_labels() #ax1のラベル取得
h2, l2 = ax2.get_legend_handles_labels() #ax2のラベル取得
ax1.legend(h1+h2, l1+l2 ,loc='lower right') #グラフ右下に凡例を表示
plt.show()
```
## 4：複数のグラフを作成する
```python:test.py
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv(r'/content/drive/MyDrive/Colab Notebooks/Qiita/test.csv', encoding='shift_jis')
fig = plt.figure()

###<追加部分>###
plt.subplots_adjust(wspace=0.0, hspace=0.6) # 余白を設定
ax1 = fig.add_subplot(2,1,1) #２行１列グラフの１行目の設定
###############

ax2 = ax1.twinx()
ax1.plot(df['Label1'], df['Label2'],color='blue', label='The label2') #ラベル名を追記
ax2.plot(df['Label1'], df['Label3'],color='green', label='The label3') #ラベル名を追記
ax1.set_xlim([0, 20]) #x軸の表示範囲
ax1.set_ylim([-4, 4]) #y1軸の表示範囲
ax2.set_ylim([-40, 40]) #y2軸の表示範囲
ax1.grid(True) #グリッド表示
ax1.set_title('Result1')    #タイトル
ax1.set_xlabel('Time_sec')  #x軸ラベル
ax1.set_ylabel('Y1')  #y1軸ラベル
ax2.set_ylabel('Y2')  #y2軸ラベル
h1, l1 = ax1.get_legend_handles_labels() #ax1のラベル取得
h2, l2 = ax2.get_legend_handles_labels() #ax2のラベル取得
ax1.legend(h1+h2, l1+l2 ,loc='lower right') #グラフ右下に凡例を表示

###<追加部分>###
ax1 = fig.add_subplot(2,1,2) #２行１列グラフの２行目の設定
ax3 = ax1.twinx()
ax1.plot(df['Label1'], df['Label2'],color='blue', label='The label2') #ラベル名を追記
ax3.plot(df['Label1'], df['Label4'],color='green', label='The label4') #ラベル名を追記
ax1.set_xlim([0, 20]) #x軸の表示範囲
ax1.set_ylim([-4, 4]) #y1軸の表示範囲
ax3.set_ylim([10, 90]) #y2軸の表示範囲
ax1.grid(True) #グリッド表示
ax1.set_title('Result2')    #タイトル
ax1.set_xlabel('Time_sec')  #x軸ラベル
ax1.set_ylabel('Y1')  #y1軸ラベル
ax3.set_ylabel('Y3')  #y2軸ラベル
h1, l1 = ax1.get_legend_handles_labels() #ax1のラベル取得
h3, l3 = ax3.get_legend_handles_labels() #ax3のラベル取得
ax1.legend(h1+h3, l1+l3 ,loc='lower right') #グラフ右下に凡例を表示
###############

plt.show()
```
実行後、下のように表示されればOK
![test05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919724/95b48f61-f4b3-9a29-95ef-ba1e79ffaf3d.png)


## 最後に
いかがでしょうか？４では長いコードを書きましたが以下４問に回答できる人は少なくないと思います。
回答できた人は既にpythonを業務に活用することができる、あるいはその第一歩を踏み出した状態と言えます。

:::note info
・Result1のy1軸のラベル「Y1」を変更する場合、コードのどこを編集すればよいか
・Result1とResult2のグラフの間の余白を大きくしたい場合、コードのどこを編集すればよいか
・Result2のy2軸の表示範囲を変更したい場合、コードのどこを編集すればよいか
・Result3もさらに追加して３行１列のグラフを作成する場合、コードをどのように編集すればよいか
:::

コードの書き方は様々なのでもっと短いコードでも同じことができます
ただ、はじめてpythonを使う人は「pythonってどのようなコードを書くの？」と思っていた人は本記事で理解を深められたものと思います。