Matplotlibのグラフ作成の具体的な案とよく使うページ

Matplotlib何をどうしたいかと思ったときの便利ノートのつもりでまとめました。
公式サイト中心にこういうことができるというのと、どのページを見るとわかりやすいのかについてまとめ。

## 時系列データのプロット

グラフにしたい時はだいたい時系列に皆さんしたいのではないかなと思います。

https://machinelearningmastery.com/time-series-data-visualization-with-python/



~~~
#reading library

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

#reading excel data
from pandas import read_excel #here if you want to import csv, change csv from excel

input_book = pd.ExcelFile('エクセル名xlsx')

input_sheet_name = 'エクセルシート名'

#check the input of sheet name
print (input_sheet_name)



# without any modification

# Reading the Excel file
file = pd.read_excel('呼び出したいエクセル名（ディレクトリ上にないといけない）.xlsx')

# Assuming 'Sampling date' is your time variable and 'Concentration' is the concentration column
file['Date'] = pd.to_datetime(file['Date'])  # Convert to datetime if not already
x_axis = file['Date']
y_axis = file['ｘｘｘ value']

# Plotting results
plt.plot(x_axis, y_axis, marker='o', label='ｘｘｘ value')
plt.xlabel('Time (Years)')
plt.ylabel('ｘｘｘ value')
plt.title('ｘｘｘ value')
plt.legend()
plt.grid()
plt.show()
~~~


ラインプロット:

~~~
plt.plot(x_axis, y_axis, label='Observational value', linestyle='-', linewidth=2)
~~~
ステッププロット:
~~~
plt.step(x_axis, y_axis, label='Observational value', where='mid', linestyle='--', linewidth=2)
~~~

散布図:
~~~
plt.scatter(x_axis, y_axis, label='Observational value', marker='x', color='red')
~~~

面グラフ:
~~~
plt.fill_between(x_axis, y_axis, label='Observational value', alpha=0.3)
~~~
これらは一部の例であり、linestyle、linewidth、color、alpha などのパラメータを使用してプロットの外観を変更できます。他にも様々なカスタマイズが可能です。適切なプロットの表現方法は、データの性質や伝えたい情報によって異なります。プロットの外観を調整して、データの特徴をより明確に伝えるようにしてください。

あとはバイオリンプロットとかもある。
箱ひげ図より柔軟に頒布しているのを表してくれる図です。


### 色付けもグラフ化では大事な作業

カラーコード一覧は下記の通り

https://matplotlib.org/stable/gallery/color/named_colors.html

具体的な色の付け方は下記のページがわかりやすかったなと思います。

https://www.python.ambitious-engineer.com/archives/2780

つまり基本的には

~~~
# カラーマップ
cm = plt.cm.get_cmap('色のコード')


plt = ax.scatter( xxxxx, cmap=cm)
 
~~~

すればいいんですね！

### 一つのグラフに様々なデータを乗せる＋エクセルから読み出す

呼び出し方

https://www.geeksforgeeks.org/plot-data-from-excel-file-in-matplotlib-python/




~~~

# Data for Landuse type "V"
x_axis_v = file.loc[file['エクセルの列項目名'] == '項目の列で特に探したいデータ値']
y_axis_v = file.loc[file['エクセルの列項目名'] == '項目の列で特に探したいデータ値', '項目の列で特に探したいデータ値２（条件追加）']



plt.scatter(x_axis_v, y_axis_v, marker='o', label='oooooo(ラベリングしたい名前)')

# Plotting results
plt.xlabel('Time (Years)')
plt.ylabel('ｘｘｘ')
plt.title('ｘｘｘ')
plt.legend()
plt.grid()
plt.show()
~~~


## 重なっている文字をよける

文字が重なっている場合はコードを足すとよけられます。



## ２つ以上のグラフを一つの図にする

https://datumstudio.jp/blog/matplotlib-2%E8%BB%B8%E3%82%B0%E3%83%A9%E3%83%95%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9/



## 作成時によく参照するページ

###### グラフの種類

どのデータを出すにはどういったグラフで示すと効果的かについて考えます。
普通に「types of graphics in matplotlib」でググりましょう。たくさん回答が出てきます。


Histogram
Barplot
Scatter plot
P I e chart
Line plot
Box plot
Area plot
Bar graph using matplotlib
Area chart
D graphs


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334349/9056a58b-8057-c1f3-24ff-2c0b95c09c12.png)
(Google検索結果からスクリーンショットを取ったものを抜粋)


公式ページで個人的によく見るページです。公式サイト

https://matplotlib.org/stable/plot_types/index.html



###### 色
色は正直下記のように入れればいいだけだし英語さえわかれば簡単に変えられるのでそれほど公式サイトは見なくていいです。
ただカラーのセットを自分でそろえたくないときには公式サイトのセット一覧を見たほうがよさそうです。

https://matplotlib.org/stable/users/explain/colors/colors.html


あとはChatGPT.これがあれば間違いないでしょう。


### マーカーの形

どんな形の点を表したいか、多くのデータを一つのグラフにプロットするので様々な種類用意したいという方はこちら・（色で変えるだけでもいいんだけど）

https://matplotlib.org/stable/api/markers_api.html

#### スキャッターのやり方

https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.scatter.html

~~~
pyplot.plot
~~~

を

~~~
pyplot.scatter
~~~

にすればいいだけです。


あとは下記も参考になるかもしれない

https://python-course.eu/books/bernd_klein_python_data_analysis_a4.pdf


### スタイルの変更

あまり使わないですがかっこよくしたかったりグラフをグレースケールにお手軽にしたい時に知っておくと便利だと思います。

https://qiita.com/eriksoon/items/b93030ba4dc686ecfbba

例：
~~~
plt.style.use('_mpl-gallery')
~~~

### 凡例を加える
~~~
ax.legend()
~~~
凡例とは何かというと、それぞれのグラフの色や種類についての説明を加えるものの事を凡例という。通常の会話で使わないのでわかりにくいですよね。
 label 引数で指定したラベルが凡例に表示されます。


 ### ダウンサンプリング

サンプルの数があってないときはそろえて分析の精度をあげるようにしたい。
 
 https://funmatu.wordpress.com/2017/10/24/%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E9%96%93%E5%BC%95%E3%81%8D%EF%BC%88%E3%83%80%E3%82%A6%E3%83%B3%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B0%EF%BC%89/


 ### 閾値などの線を入れる

グラフに閾値を入れて視覚的にどの程度の値からを注目すればいいかを見せる方法

 https://ensekitt.hatenablog.com/entry/2018/10/01/200000

 横の線（閾値）

~~~
plt.hlines([v[0].mean()], v[1].min(), v[1].max(), "blue", linestyles='dashed')
~~~

linestylesはDashed以外にもいろいろあります。下記のサイトで好みのものを選ぶのがよさそう。

https://matplotlib.org/stable/gallery/lines_bars_and_markers/linestyles.html

mean valueは「平均値」です。
（でもどういうときに平均値を線で使うんだろう。ちょっといい使い方が私の範囲内ではあまり思い浮かばないですね


縦の線（閾値）



### プロットする開始と終わりの数値を指定する

グラフを一つの条件のコードで複数同時生成したいがそうすると指定しないと

https://stackoverflow.com/questions/54600249/how-to-set-x-axis-initial-or-final-value-in-matplotlib


~~~
fig, ax = plt.subplots()

# Stuff

ax.set_xlim(1<最小値>, 30<最大値>)
~~~

上記は数値の場合。もしｘ軸が年数だとしたら下記のように修正が必要

~~~
# 日数でx軸の範囲を設定
    ax.set_xlim(pd.Timestamp('1990-01-01').toordinal(), pd.Timestamp('2030-01-01').toordinal())
    
~~~
参考

https://stackoverflow.com/questions/19079143/how-to-plot-time-series-in-python/19079248#19079248