PythonのMatplotlibにおけるヒストグラムの作成方法を初心者向けに解説した記事です。
通常のヒストグラムだけではなく、色分けと凡例を用いた複数の系列データの表示方法、CSVファイルからデータを取得してのヒストグラムの描き方や、日本語対応などを解説しています。
またグラフの装飾方法については、タイトル、ラベル、目盛線、凡例などの使い方を解説していきます。
発売数9,000本突破を記念して、今だけ期間限定で87%オフの大セール中!!!
Matplotlibでのヒストグラムの描画と装飾(タイトル、ラベル、目盛線、凡例、マーカー、色、透明度)
ヒストグラムでは、区間ごとの度数をグラフ化することで、データの分布状況を確認することができます。
ここでは例として、ある店舗における年齢ごとの訪問回数のデータを元にmatplotlibでヒストグラムを作成し、年齢と訪問回数の関係を確認します。
(但し、ここでは簡素化の為、元データは乱数で作成しております。)
シンプルなヒストグラムの描画(正規分布に基づく乱数により作成)
まずは何も装飾を施さないで、シンプルなヒストグラムを描画してみましょう。
1 2 3 4 5 6 7 8 9 | import numpy as np import matplotlib.pyplot as plt # データ準備 dataset1=np.random.normal(30, 8, 100) # (1)データの格納 # グラフの描画 plt.hist(dataset1) #(2)ヒストグラムの描画 plt.show() |
ヒストグラムの表示結果から、やはり年齢ごとに訪問頻度が異なっているようです。このようなデータを用いて、ターゲットとなる年齢層を特定できそうですね。
それではプログラムの説明に入ります。
import matplotlib.pyplot as plt
まず最初に必要なライブラリをimport文で読み込んでいます。NumPyを利用する為にnumpyをインポートします。その際に別名「np」を付けることにより、以降のプログラムでは「numpy」と記述しなくても「np」と記述することでNumPyを使うことができるようになります。
また同様にMatplotlibを利用する為に、matplotlib.pyplotクラスをインポートし、別名として「plt」を付けています。
(1)では、年齢毎の訪問頻度が入っているndarray型のデータを変数dataset1に格納しています。ここでは、np.random.normalを利用して、正規分布にしたがった乱数(平均30、標準偏差8)を100個作成しています。
(2)では、histに変数dataset1を渡してヒストグラムを描画しています。
主な引数は、
引数 | 必須/任意 | 説明 |
x | 必須 | ヒストグラムを描画するデータを指定 |
bins | 任意 | 階級(ヒストグラムの棒)の数。何も指定しなければ、10 |
range | 任意 | ヒストグラムの棒の最小値、最大値を指定。 何も指定しなければ、指定されたデータの最小値、最大値。 |
cumulative | 任意 | True:累積ヒストグラムを表示 False:通常のヒストグラムを表示 ※何も指定しなければ、False |
color | 任意 | ヒストグラムの色を指定 |
label | 任意 | 凡例を指定 |
引数colorで指定できる主な色は以下です。
記号 | 色 |
b | 青 |
k | 黒 |
r | 赤 |
g | 緑 |
y | 黄 |
w | 白 |
c | シアン |
m | マゼンダ |
色はcolor = (0.0, 0.0, 1.0)のように、RGB それぞれのを色の要素を 0.0 ~ 1.0 のタプルで指定することも可能です。
ヒストグラムの装飾(タイトル・ラベル・目盛線・棒の色)
それでは次にグラフに装飾を施してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 | # グラフの装飾 plt.xlim(5, 55) # (1) x軸の表示範囲 plt.ylim(0, 30) # (2) y軸の表示範囲 plt.title("Store Visitors", fontsize=20) # (3) タイトル plt.xlabel("Age", fontsize=20) # (4) x軸ラベル plt.ylabel("Frequency", fontsize=20) # (5) y軸ラベル plt.grid(True) # (6) 目盛線の表示 plt.tick_params(labelsize = 12) # (7) 目盛線のラベルサイズ # グラフの描画 plt.hist(dataset1 , alpha=0.5, color= 'c') #(8) ヒストグラムの描画 plt.show() |
タイトルやラベルなど、装飾されたヒストグラムが表示されました。
装飾のプログラムについても、解説していきます。
plt.ylim(0, 30) # (2) y軸の表示範囲
(1)では、xlimを使いx軸の表示範囲を指定しています。引数は開始位置、終了位置になります。(2)も同様に、ylimを使いy軸の表示範囲を指定しています。
(3)では、titleでタイトル「Store Visitors」を表示しています。また引数fontsizeでは、タイトルのフォントサイズを指定しています。
plt.ylabel("Frequency", fontsize=20) # (5) y軸ラベル
(4)では、xlabelでx軸ラベル「Age」を表示しています。またtitleと同様に、引数fontsizeでは、x軸ラベルのフォントサイズを指定しています。(5)も同様に、ylabelを使いy軸ラベルを表示しています。
(6)では、gridの引数でTrueを指定することにより、目盛線を表示しています。Falseを指定したり、gridを記述しなければ、目盛線は表示されません。
(7)では、目盛線のラベルのフォントサイズを指定しています。
(8)では、histに変数dataset1を渡してヒストグラムを描画しています。
引数alphaでは、ヒストグラムの棒の透明度を指定します。0(透明)~1(不透明)までの値を指定します。0.2など透明に近づけると、色が薄くなりますが、マーカーの重なり具合が分かり易くなります。
そして、引数colorでは色を指定します。ここではc(シアン)を指定しています。
このようにしてヒストグラムにタイトルやラベルを表示したり、ヒストグラムの棒の色を変えたりすることができます。
Matplotlibのヒストグラムで複数系列のデータを重ねて表示
複数の系列のデータを元にヒストグラムを描く場合、それぞれの棒がどの系列のデータを示しているか色分けし、凡例を表示する必要があります。
ここでは例として、ある店舗における男女別の年齢ごとの訪問回数のデータを元にmatplotlibでヒストグラムを作成してみましょう。その際に、男性のデータと女性のデータと、複数の系列データを色分けして重ねて表示し、凡例を追加していきます。
(但し、ここでも前回同様、簡素化の為、元データは乱数で作成しております。)
1 2 3 4 5 6 7 8 9 10 11 12 | import numpy as np import matplotlib.pyplot as plt # データ準備 dataset1=np.random.normal(30, 8, 100) # (1)データの格納(男性) dataset2=np.random.normal(25, 10, 100) # (2)データの格納(女性) # グラフの描画 plt.hist(dataset1, alpha=0.5, bins=20, label="Man") # (3) ヒストグラムの描画(男性) plt.hist(dataset2, alpha=0.3, bins=20, label="Woman", color='r') # (4) ヒストグラムの描画(女性) plt.legend(loc="upper left", fontsize=13) # (5)凡例表示 |
ヒストグラムの表示結果から、男女では年齢ごとの訪問頻度に違いがあり、女性の方が比較的若い年齢層が多いようです。このように男女別の詳細なデータを用いて、ターゲットとなる性別・年齢層をさらに特定することができそうですね。
それではプログラムの説明に入ります。
dataset2=np.random.normal(25, 10, 100) # (2)データの格納(女性)
(1)(2)ともに、先ほどと同様np.random.normalを利用して、正規分布にしたがった乱数を100個作成しています。そして変数dataset1、dataset2にデータを格納しています。
(3)では、histに変数dataset1を渡して男性データ分のヒストグラムを描画しています。引数alphaで透明度を上げています。引数binsには20を指定して、ヒストグラムの棒の数を20にしています。また (5)の凡例の表示に使えるよう、引数labelに"Man”を渡しています。
color='r') # (4) ヒストグラムの描画(女性)
(4)では、histに変数dataset2を渡して女性データ分のヒストグラムを引数color=”r”(赤色)で描画しています。引数labelに"Woman”を渡しています。引数alpha、binsは(5)と同様です。
(5)では、legendで凡例を表示しています。その時に表示されるラベルは(3)、(4)でlabelとして指定したものになります。引数fontsizeでラベルの文字サイズを指定します。
また引数locでは凡例の表示位置を指定しており、次の位置を指定できます。
表示位置 | locの指定内容 |
右上 | upper right |
右下 | lower right |
左上 | upper left |
左下 | lower left |
発売数9,000本突破を記念して、今だけ期間限定で87%オフの大セール中!!!
CSVファイルを読み込み、Matplotlibでヒストグラムの描画
前の例では、必要な売上や温度のデータは、NumPyのarrayに直接入力していましたが、実務では、これらのデータはCSVファイルなどのテキストファイルから読み込むことが多いです。今度の例では、CSVファイルから読み込んだデータを元にヒストグラムを描いてみましょう。
ここではあるスーパーマーケットチェーンの買い物客毎の購入金額(円)を格納したCSVファイル「Sales_Area_A.csv」(※csvファイルは上のリンクより取得下さい。)をPandasというライブラリを用いて読み込みます。
Pandasについては、「Pandasでデータ分析(インストールから使い方まで)」をご参照ください。
それではプログラムを見ていきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import matplotlib.pyplot as plt import pandas as pd #(1) Pandasのインポート # データ準備 sales = pd.read_csv("Sales_Area_A.csv", squeeze = True) #(2) csvファイルの読み込み # グラフの装飾 plt.xlim(350, 1300.0) # x軸の表示範囲 plt.ylim(0, 100) # y軸の表示範囲 plt.title("Frequency of Sales Area A", fontsize=20) # タイトル plt.xlabel("Sales", fontsize=20) # x軸ラベル plt.ylabel("Frequency", fontsize=20) # y軸ラベル plt.grid(True) # 目盛線の表示 plt.tick_params(labelsize = 12) # 目盛線のラベルサイズ # グラフの描画 plt.hist(sales) #(3) ヒストグラムの描画 plt.show() |
グラフの下に表示されているのが購入金額の範囲で、横軸に表示されているのが頻度になります。このようなヒストグラムを表示することで、それぞれの購入金額の範囲毎に、どのくらいの頻度があるのか、一目瞭然となります。
平均値約800円近くの購入頻度はほとんど無く、600円の前後と、1050円の前後の頻度が高いようです。
それではプログラムを解説していきます
Matplotlibに加えて、ここではPandasも利用するのでインポートします。
次にCSVファイル「Sales_Area_A.csv」からデータを読み込みます。CSVファイルの読み込みは、pd.read_csvを利用します。
その際に引数として読み込むファイル名「Sales_Area_A.csv」と、squeezeにTrue(Seriesとしてデータを読み込む)を指定します。この読み込んだデータを変数salesに格納します。
CSVファイル読み込みの詳しい説明は、「Pandas Excel、CSVファイルの読み込み、書き込み」を参照ください。
残りのプログラムは今までと同様です。最後に変数salesをhistに渡して、ヒストグラムを描画しています。
PandasとMatplotlibのヒストグラムを用いたデータ分析事例の詳細は、次の記事の最後をご確認ください。
ヒストグラムの日本語対応
Matplotlibでは、標準では日本語対応がされておらず、ヒストグラムなどのグラフのタイトルやラベルは英語でしか表記できません。日本語を無理に表示しようとすると、文字化けが発生し、「□□□」のような文字が表示されるだけで、正しく表示できません。
以下の記事では、Python初心者でも簡単にできる日本語対応の仕方を解説していきます。
またここでは、参考までに日本語化の例を載せておきます。詳細は、上の記事をご参考ください。コメントに「*日本語対応」を付けた箇所が今回の日本語対応の為に変更した箇所になります。
地域Bのデータとして、CSVファイル「Sales_Area_B.csv」からデータを読み込み、地域Aのデータと合わせてヒストグラムを表示しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | import matplotlib.pyplot as plt import pandas as pd from matplotlib.font_manager import FontProperties # *日本語対応 fp = FontProperties(fname=r'C:\WINDOWS\Fonts\msgothic.ttc', size=16) # *日本語対応 # データ準備 sales_a = pd.read_csv("Sales_Area_A.csv", squeeze = True) sales_b = pd.read_csv("Sales_Area_B.csv", squeeze = True) # グラフの装飾 plt.xlim(100, 1300.0) # x軸の表示範囲 plt.ylim(0, 100) # y軸の表示範囲 plt.title("売上度数分布", fontsize=20, fontproperties=fp) # タイトル *日本語対応 plt.xlabel("売上 (円)", fontsize=20, fontproperties=fp) # x軸ラベル *日本語対応 plt.ylabel("頻度", fontsize=20, fontproperties=fp) # y軸ラベル *日本語対応 plt.grid(True) # 目盛線の表示 plt.tick_params(labelsize = 12) # 目盛線のラベルサイズ # グラフの描画 plt.hist(sales_a, alpha=0.5, label="地域A") plt.hist(sales_b, alpha=0.5, label="地域B", color='indianred') plt.legend(loc="upper left", fontsize=13, prop=fp) #凡例表示 *日本語対応 plt.show() |
グラフのタイトルやラベル、凡例などが日本語化されているのが確認できました。
発売数9,000本突破を記念して、今だけ期間限定で87%オフの大セール中!!!
ヒストグラムを保存する方法
ヒストグラムのグラフの画像を保存したい場合、次のように記述します。
※注意点として、plt.show()で画面に表示する場合、上記の文を先に記述してください。順番が逆になると空白の画像が保存される可能性があります。
例えば先ほどJupyter notebookに表示したヒストグラムをPNG形式でファイル名”histogram.png”で保存してみましょう。先ほど記述したコードのplt.show()の前にplt.savefig()を追記して下さい。
1 2 | plt.savefig(“histgram.png”) #グラフの保存 plt.show() |
保存された”histogram.png”を開くと、画面に表示された画像と同じものが表示されました。
このようにして、作成したグラフを保存することもできます。
Matplotlibで複数のグラフを並べて描画
複数のヒストグラムを比較できるよう並べて表示したり、またヒストグラムと散布図や棒グラフなど他のグラフと並べて表示する方法は、以下のリンクをご参照ください。
関連記事です。
折れ線グラフについても確認しましょう。
棒グラフ、積み上げ棒グラフの描き方については、こちらが参考になります。
円グラフの描き方については、こちらをご覧ください。