さまざまなグラフを描く (1/6)
作成:2018-02-17 09:22
更新:2018-02-17 09:22
更新:2018-02-17 09:22
■棒グラフの描画
matplotlibでは、plotメソッドで線分によるグラフ(いわゆる折れ線グラフ)を描くことができました。が、それ以外のグラフを描く機能も充実しています。
まずは、「棒グラフ」からです。棒グラフは、「bar」というメソッドで描画できます。これは以下のように利用します。
これで棒グラフ自体は描けますが、棒グラフの場合、Y軸は数値であったとしても、X軸は必ずしも数値とは限りません。例えば、各教科の点数をグラフにしたり、各支店の売り上げをグラフにする場合、Y軸は点数や金額となりますが、X軸は各教科や各支店名が並ぶことになります。
こうした場合、描かれる棒それぞれにラベルを表示しておく必要があります。それを行うのが、「tick_label」という引数です。これにリストなどの形でラベルをまとめたものを渡すことで、各棒ごとにラベルが表示できます。
簡単な利用例を下に挙げておきましょう。
ここでは、AとBの2つのグラフを1つのプロットに表示しています。barメソッドは、plotと同様に複数回呼び出して複数の棒グラフを描画できます。が、そのままでは、新たに描いが棒グラフが前のものを上書きしてしまいます。
ここでは、2つの棒グラフのX座標をそれぞれ以下のように設定してあります。
では、複数の棒グラフを重ねてスタックするにはどうすればいいのでしょうか? これには、「bottom」引数を指定します。例えば、下のサンプルならば、こんな具合にしてbarを呼び出すのです。
まずは、「棒グラフ」からです。棒グラフは、「bar」というメソッドで描画できます。これは以下のように利用します。
《matplotlib》.bar( X座標 , Y座標 )引数には、描画するグラフのX座標とY座標のデータをリストなどにまとめたものを用意します。またplotメソッドと同様、凡例に表示するラベルをlabel引数で指定することもできます。
これで棒グラフ自体は描けますが、棒グラフの場合、Y軸は数値であったとしても、X軸は必ずしも数値とは限りません。例えば、各教科の点数をグラフにしたり、各支店の売り上げをグラフにする場合、Y軸は点数や金額となりますが、X軸は各教科や各支店名が並ぶことになります。
こうした場合、描かれる棒それぞれにラベルを表示しておく必要があります。それを行うのが、「tick_label」という引数です。これにリストなどの形でラベルをまとめたものを渡すことで、各棒ごとにラベルが表示できます。
簡単な利用例を下に挙げておきましょう。
■複数グラフの描画
ここでは、AとBの2つのグラフを1つのプロットに表示しています。barメソッドは、plotと同様に複数回呼び出して複数の棒グラフを描画できます。が、そのままでは、新たに描いが棒グラフが前のものを上書きしてしまいます。
ここでは、2つの棒グラフのX座標をそれぞれ以下のように設定してあります。
x1 = [0, 2, 4, 6, 8]このようにして、2つのグラフが偶数値と奇数値に1つずつずれて表示されるようにすることで、2つの棒グラフを並べて表示させているわけです。同様に、X軸の位置を調整すれば3つでも4つでも並べて表示できます。
x2 = [1, 3, 5, 7, 9]
■スタックするには?
では、複数の棒グラフを重ねてスタックするにはどうすればいいのでしょうか? これには、「bottom」引数を指定します。例えば、下のサンプルならば、こんな具合にしてbarを呼び出すのです。
# x = [0, 1, 2, 3, 4]ここでは、1回目のbarで普通に棒グラフを描いています。そして2回目のbarのとき、bottomという引数で、1回目の棒グラフのデータy1を引数に指定しています。このbottomは、描画するグラフの下位置を示します。これに、1回目の棒グラフのデータを指定することで、2回目の棒グラフは、1回目の棒の上端から描き足されるようになるのです。
plt.bar(x, y1, tick_label=data, label='A')
plt.bar(x, y2, label='B',bottom=y1)
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
import numpy as np import matplotlib.pyplot as plt x1 = [0, 2, 4, 6, 8] x2 = [1, 3, 5, 7, 9] y1 = np.array([np.random.randint(100) + 50 for i in range(5)]) y2 = np.array([np.random.randint(100) + 50 for i in range(5)]) data = ['A', 'B', 'C', 'D', 'E'] plt.bar(x1, y1, tick_label=data, label='A') plt.bar(x2, y2, label='B') plt.title = 'sample bar' plt.legend() plt.show()
※関連コンテンツ