0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

matplotlibについて (2)棒グラフ・円グラフ・ヒストグラム

Posted at

前回は散布図・折れ線図について書いたので今回は棒グラフ・円グラフ・ヒストグラムについて書こうと思います。
グラフの基本設定については前回の投稿を読んでください

棒グラフ(bar)

基本的なものは以下の通り

bar_1.py
import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y1 = [10, 40, 70, 20, 55]

plt.bar(x, y1, width=0.5, color="blue")

plt.title("Bar graph")
plt.xlabel("x")
plt.ylabel("Y")
plt.show()

width(=0~1, デフォルトは0.8)を指定すると棒の太さが変化する.
colorは見ての通り色の指定
image.png
少しカスタマイズしてみましょう

bar_2.py
import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y1 = [10, 40, 70, 20, 55]
y2 = [30, 40, 50, 20, 70]
label = ["first", "second", "third", "forth", "fifth"]

plt.bar(x, y1, tick_label=label, color="green", label="class1")
plt.bar(x, y2, tick_label=label, bottom=y1, color="orange", label="class2")

plt.title("Bar graph")
plt.xlabel("x")
plt.ylabel("Y")
plt.legend()
plt.show()

bottom=で指定してやることでその指定した分を空けて描画することができる。結果積み重なるグラフを描く事ができる。
この場合でいうとy1の棒グラフを書き、その後y1分空けたところにy2のグラフを描くということで結果y1の上にy2の乗ったグラフを描くことになる。
tick_label=で指定するとx座標に数字ではなく文字列を貼ることができる。
実行結果が下の通り
image.png

bar_3.py
import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y1 = [10, 40, 70, 20, 55]
y2 = [30, 40, 50, 20, 70]
label = ["first", "second", "third", "forth", "fifth"]

plt.barh(x, y1, tick_label=label, color="green", label="class1")
plt.barh(x, y2, tick_label=label, left=y1, color="orange", label="class2")

plt.title("Bar graph")
plt.xlabel("x")
plt.ylabel("Y")
plt.legend()
plt.show()

また、上のコードのようにplt.bar()ではなくplt.bar()で描画すると横向きの棒グラフを描くことができる
このとき、bar()関数ではbottom=で積み重ねを指定していたのがbarh()関数ではleft=で指定することに注意が必要
グラフの形状をイメージしていただけるとなぜleft=なのかわかると思います
実行結果が下のようになるはず
また、上からではなく下から順番にグラフが作られる。
image.png

円グラフ(pie)

次に円グラフの描画

pie.py
import matplotlib.pyplot as plt

x = [100, 200, 300, 400, 500]
label = ["first", "second", "third", "forth", "fifth"]

plt.pie(x, labels=label)
plt.show()

実行するともしかしたら以下のように楕円で表示されるかもしれない
image.png
これを防ぐには、以下のようにplt.axis("equal")を追加する

pie_2.py
import matplotlib.pyplot as plt

x = [100, 200, 300, 400, 500]
label = ["first", "second", "third", "forth", "fifth"]

plt.pie(x, labels=label)
plt.axis("equal")
plt.show()

image.png
これを見てみると一番目の値が右から始まっている。
デフォルトでは反時計回り、頂点から右90度から始まる
頂点から時計回りに初めたいときは、以下のようにする

pie_3.py
import matplotlib.pyplot as plt

x = [100, 200, 300, 400, 500]
label = ["first", "second", "third", "forth", "fifth"]

plt.pie(x, labels=label, counterclock=False, startangle=90)
plt.axis("equal")
plt.show()

image.png

pie_4.py
import matplotlib.pyplot as plt

x = [100, 200, 300, 400, 500]
label = ["first", "second", "third", "forth", "fifth"]

plt.pie(x, labels=label, counterclock=False, startangle=90, autopct="%.1f%%")
plt.axis("equal")
plt.show()

autopct=を指定することで割合を表示できる。上のコードの場合は小数点1桁までを表示
image.png

ヒストグラム(hist)

基本コードは以下の通り
今回はデータ作成のためにNumpyをインポートして使用している

hist_1.py
import matplotlib.pyplot as plt
import numpy as np

# 平均50,標準偏差10の正規乱数を1000件生成
x = np.random.normal(50, 10, 1000)

plt.hist(x)
plt.show()

image.png
これだとビン(分布幅)ごとの区切りが無く見にくいので以下のようなコードにし変更する

hist_2.py
import matplotlib.pyplot as plt
import numpy as np

# 平均50,標準偏差10の正規乱数を1000件生成
x = np.random.normal(50, 10, 1000)

plt.hist(x, ec="black")
plt.show()

image.png
デフォルトではビン数(分布の分割数)が10に設定されている
ビン数やビンの範囲を設定することもできる

hist_3.py
import matplotlib.pyplot as plt
import numpy as np

# 平均50,標準偏差10の正規乱数を1000件生成
x = np.random.normal(50, 10, 1000)

plt.hist(x, ec="black", bins=20, range=(0, 100))

plt.xlim(0, 100)
plt.show()

bins=でビン数を指定、range=(min, max)で最小・最大値を定める
今回でいうと0~100でビン20個でヒストグラム作成をする
ただデータが平均50の標準偏差10なので0のビンも存在する
image.png

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?