matplotlibで簡単なグラフを描画する
Pythonでグラフを描く勉強をしてます。備忘録的にまとめていきたいと思います。
グラフの和名と英名
matplotlibを使ってグラフを描く際、グラフの種類を指定しますが、日本語でなく英語です。なので、まずはその対応表を作っておきたいと思います。
りんごとオレンジの価格変動を描く(折れ線グラフ)
とりあえず何かトピックがないとつまらないので、フィーリングでりんごとオレンジの価格変動をグラフにしたいと思います。以下のデータは架空です。私のフィーリングで値付けしました。
import matplotlib.pyplot as plt
year = [2018, 2019, 2020, 2021]
apple_price = [100, 500, 150, 300]
orange_price = [500, 100, 145, 200]
plt.plot(year, apple_price, label="Apple Price")
plt.plot(year, orange_price, label="Orange Price")
plt.xlabel("Year")
plt.ylabel("Price (JPY)")
plt.title("Price Change")
plt.legend()
plt.show()
これをGoogle Colaboratoryで実行すると、以下のようなグラフが描けます。
2019年のリンゴの値段が500円って・・・高いですね、というのはどうでも良いのですが、しっかりシンプルなグラフを描くことができました。
りんごとオレンジの価格変動(合計)を描く(棒グラフ)
次に、各年ごとのリンゴとオレンジの価格の合計を棒グラフで描きます。なぜ合計なのか、それは、そうなってしまったからです。
以下のようにplt.plot()
をplt.bar()
にすれば、とりあえず、某グラフになります。
import matplotlib.pyplot as plt
year = [2018, 2019, 2020, 2021]
apple_price = [100, 500, 150, 300]
orange_price = [500, 100, 145, 200]
plt.bar(year, apple_price, label="Apple Price")
plt.bar(year, orange_price, label="Orange Price")
plt.xlabel("Year")
plt.ylabel("Price (JPY)")
plt.title("Price Change")
plt.legend()
plt.show()
これをGoogle Colaboratoryで実行すると以下のようなグラフができます。
plt.bar(x, y, label="label", color="blue")
等とすると色の指定もできます。
りんごが一番好きな世代を描く(ヒストグラム)
どの世代が一番りんごが好きなのか、ヒストグラムを利用して分析してみます。
コードを見れば分かりますが、架空の情報です(年齢はrandomで作成してます)。
# Histgram
import matplotlib.pyplot as plt
import random
apple_lover_ages = [random.randint(5, 100) for i in range(0, 100)]
bins = [i for i in range(0, 101, 10)]
plt.hist(apple_lover_ages, bins, histtype="bar", rwidth=0.8)
plt.xlabel("Age Range")
plt.ylabel("Num of Apple Lovers")
plt.title("Generation Loving Apples")
plt.legend()
plt.show()
このコードをGoogle Colaboratoryで実行すると以下のようなヒストグラムを得られます。りんごが一番好きな世代は70代、次に90代ということが分かりました(ランダムな架空のデータですが)。
りんごとオレンジの価格の相関を見る(散布図)
りんごとオレンジの価格の相関を見てみます。この時利用するのが散布図です。
# Scatter Plot: see if correlation
import matplotlib.pyplot as plt
import random as rnd
apple = [rnd.randint(50, 1000) for i in range(100)]
orange = [rnd.randint(50, 1000) for j in range(100)]
plt.scatter(apple, orange, label="Price", color="black", marker="*", s=100)
plt.xlabel("apple")
plt.ylabel("orange")
plt.title("Apple vs. Orange Price")
plt.legend()
plt.show()
今回もりんごとオレンジの価格はrandom.randint(a, b)
という形でaからbまでの整数をランダムで入れています。つまり、完全に架空のデータです。上記コードを実行すると以下のようになります。
本来と言いますか、ちゃんと相関を求める際は相関係数という値を求めるべきですが、目視でも相関がほとんどないことが分かります。(ランダムな値を使っているので当然ですが)
ちなみに、相関係数とは-1から1までの数値で表され、1に近いほど正の相関、-1に近いほど負の相関が強いと言えます。正の相関とはy = ax + b
で、負の相関とはy = -ax + b
と考えると分かりやすいです。
1週間で食べた果物の日ごと合計を描く(積み上げグラフ)
私が1週間で食べた果物を、日ごとに合計(積み上げ)したグラフを描いてみます。単なる合計ではなく、それぞれの果物をどれだけ食べたかも表現できるようにしてます。
ちなみに、以下のコードを見て分かるように、私が実際に食べた値ではありません。というか、普段果物はほとんど食べません。
import matplotlib.pyplot as plt
import random
days = [1, 2, 3, 4, 5, 6, 7]
apples = [random.randint(0, 10) for a in range(7)]
bananas = [random.randint(0, 10) for b in range(7)]
oranges = [random.randint(0, 10) for o in range(7)]
grapes = [random.randint(0, 10) for g in range(7)]
plt.plot([], [], color="c", label="Apples")
plt.plot([], [], color="orange", label="Bananas")
plt.plot([], [], color="k", label="Oranges")
plt.plot([], [], color="pink", label="Grapes")
plt.stackplot(days, [apples, bananas, oranges, grapes], colors=["c", "orange", "k", "pink"])
plt.xlabel("Days")
plt.ylabel("Counts")
plt.title("Consumed Fruits")
plt.legend()
plt.show()
これをGoogle Colaboratoryで実行すると以下のようになります。
2日目と6日目は25個以上の果物を食べていますね。架空のデータですが。5日目はバナナは食べてないようですね。架空のデータですが。
ある日食べた果物の割合を描く(円グラフ)
とある日に食べた果物の割合を描いてみようと思います。例にもれず、こちらも架空のデータを作成しています。
import matplotlib.pyplot as plt
import random
days = [i for i in range(1, 8)]
apples = random.randint(0, 10)
bananas = random.randint(0, 10)
oranges = random.randint(0, 10)
grapes = random.randint(0, 10)
x = [apples, bananas, oranges, grapes]
fruits = ["Apples", "Bananas", "Oranges", "Grapes"]
colors = ["red", "yellow", "orange", "purple"]
plt.pie(x, labels=fruits, colors=colors, startangle=90, shadow=True, explode=(0, 0, 0.1, 0), autopct="%1.1f%%")
plt.xlabel("Days")
plt.ylabel("Counts")
plt.title("Ratio of Consumed Fruits")
plt.legend()
plt.show()
これをGoogle Colaboratoryで実行すると以下のようになります。
4種類食べてはいますが、42.9%はりんごを食べたようですね。
少しハマったのはx = [apples, bananas, oranges, grapes]
の部分です。ここで指定した値で割合が計算されます。例えば、25、10、10、5とすると、計50に対して1つ目(apples)が25なので50%となります。
Z = X**2 + Y**2を可視化する
3Dのグラフを作成することができます。とある参考書を参考に書いたコードが以下です。正直私にはまだ何をしているか分かりませんが、以下のようにコーディングすると、3Dグラフが作成できました。
import numpy as np
from matplotlib import cm
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
def func3D(X, Y, Z):
fig = plt.figure(figsize = (10, 10))
ax = fig.add_subplot(1, 1, 1, projection="3d")
ax.set_xlabel("x", size=16)
ax.set_ylabel("y", size=16)
ax.set_zlabel("z", size=16)
ax.plot_surface(X, Y, Z, cmap=cm.coolwarm)
ax.countour(X, Y, Z, colors="blue", offset=-1)
plt.show()
def func_z(X, Y):
return X**2 + Y**2
# -10から10まで等間隔に256個の要素を生成
x = np.linspace(-10, 10, 256)
y = np.linspace(-10, 10, 256)
# 格子グリッド生成
X, Y = np.meshgrid(x, y)
# Call func_z()
Z = func_z(X, Y)
# 3D Plot
func3D(X, Y, Z)
上記をGoogle Colaboratoryで実行すると、一部エラーとなるのですが、グラフは作成できました。
これはZ = X**2 + Y**2
をグラフ化したものです。例えば、一番手前の赤く尖がった先は、Xが10、Yが-10なので、式に当てはめると200になります。Zの値を見ると200になっています。
(と言っても、目視で3Dのグラフを見るというのは見辛いですね。おそらく、値を読むというよりは、形状をみて何かを判断するのでしょうね)