17. Matplotlibでグラフの描画

Matplotlib-ヒストグラムの徹底解説!(目盛り・階級幅/数・保存・正規分布・色など)

更新日:

Pythonのヒストグラムの例1

PythonのMatplotlibにおけるヒストグラムの作成方法を初心者向けに解説した記事です。

 
通常のヒストグラムだけではなく、色分けと凡例を用いた複数の系列データの表示方法、CSVファイルからデータを取得してのヒストグラムの描き方や、日本語対応などを解説しています。

 
またグラフの装飾方法については、タイトル、ラベル、目盛線、凡例などの使い方を解説していきます。

 
 

動画教材紹介私(清水 義孝)が作成したコース「Pythonによるビジネスに役立つWebスクレイピング」(Udemyへのリンク)が新発売!今なら期間限定で89%オフ!!!

Matplotlibでのヒストグラムの描画と装飾(タイトル、ラベル、目盛線、凡例、マーカー、色、透明度)

ヒストグラムでは、区間ごとの度数をグラフ化することで、データの分布状況を確認することができます。

 
ここでは例として、ある店舗における年齢ごとの訪問回数のデータを元にmatplotlibでヒストグラムを作成し、年齢と訪問回数の関係を確認します。
(但し、ここでは簡素化の為、元データは乱数で作成しております。)

 

シンプルなヒストグラムの描画(正規分布に基づく乱数により作成)

まずは何も装飾を施さないで、シンプルなヒストグラムを描画してみましょう。

 

ヒストグラムの表示結果から、やはり年齢ごとに訪問頻度が異なっているようです。このようなデータを用いて、ターゲットとなる年齢層を特定できそうですね。

 
それではプログラムの説明に入ります。
 

import numpy as np
import matplotlib.pyplot as plt

まず最初に必要なライブラリをimport文で読み込んでいます。NumPyを利用する為にnumpyをインポートします。その際に別名「np」を付けることにより、以降のプログラムでは「numpy」と記述しなくても「np」と記述することでNumPyを使うことができるようになります。
 
また同様にMatplotlibを利用する為に、matplotlib.pyplotクラスをインポートし、別名として「plt」を付けています。

 

dataset1=np.random.normal(30, 8, 100) # (1)データの格納

(1)では、年齢毎の訪問頻度が入っているndarray型のデータを変数dataset1に格納しています。ここでは、np.random.normalを利用して、正規分布にしたがった乱数(平均30、標準偏差8)を100個作成しています。

 

plt.hist(dataset1) #(2)ヒストグラムの描画

(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 のタプルで指定することも可能です。

 
 

ヒストグラムの装飾(タイトル・ラベル・目盛線・棒の色)

それでは次にグラフに装飾を施してみましょう。

 

タイトルやラベルなど、装飾されたヒストグラムが表示されました。

 
装飾のプログラムについても、解説していきます。

plt.xlim(5, 55) # (1) x軸の表示範囲
plt.ylim(0, 30) # (2) y軸の表示範囲

(1)では、xlimを使いx軸の表示範囲を指定しています。引数は開始位置、終了位置になります。(2)も同様に、ylimを使いy軸の表示範囲を指定しています。

 

plt.title("Store Visitors", fontsize=20) # (3) タイトル

(3)では、titleでタイトル「Store Visitors」を表示しています。また引数fontsizeでは、タイトルのフォントサイズを指定しています。

 

plt.xlabel("Age", fontsize=20) # (4) x軸ラベル
plt.ylabel("Frequency", fontsize=20) # (5) y軸ラベル

(4)では、xlabelでx軸ラベル「Age」を表示しています。またtitleと同様に、引数fontsizeでは、x軸ラベルのフォントサイズを指定しています。(5)も同様に、ylabelを使いy軸ラベルを表示しています。

 

plt.grid(True) # (6) 目盛線の表示

(6)では、gridの引数でTrueを指定することにより、目盛線を表示しています。Falseを指定したり、gridを記述しなければ、目盛線は表示されません。

 

plt.tick_params(labelsize = 12) # (7) 目盛線のラベルサイズ

(7)では、目盛線のラベルのフォントサイズを指定しています。

 

plt.hist(dataset1 , alpha=0.5, color= 'c') #(8) ヒストグラムの描画

(8)では、histに変数dataset1を渡してヒストグラムを描画しています。
 
引数alphaでは、ヒストグラムの棒の透明度を指定します。0(透明)~1(不透明)までの値を指定します。0.2など透明に近づけると、色が薄くなりますが、マーカーの重なり具合が分かり易くなります。
 
そして、引数colorでは色を指定します。ここではc(シアン)を指定しています。

 
このようにしてヒストグラムにタイトルやラベルを表示したり、ヒストグラムの棒の色を変えたりすることができます。

 
 

動画教材紹介私(清水 義孝)が作成したコース「Pythonによるビジネスに役立つWebスクレイピング」(Udemyへのリンク)が新発売!今なら期間限定で89%オフ!!!

Matplotlibのヒストグラムで複数系列のデータを重ねて表示

複数の系列のデータを元にヒストグラムを描く場合、それぞれの棒がどの系列のデータを示しているか色分けし、凡例を表示する必要があります。

 
ここでは例として、ある店舗における男女別の年齢ごとの訪問回数のデータを元にmatplotlibでヒストグラムを作成してみましょう。その際に、男性のデータと女性のデータと、複数の系列データを色分けして重ねて表示し、凡例を追加していきます。
(但し、ここでも前回同様、簡素化の為、元データは乱数で作成しております。)

 

 

ヒストグラムの表示結果から、男女では年齢ごとの訪問頻度に違いがあり、女性の方が比較的若い年齢層が多いようです。このように男女別の詳細なデータを用いて、ターゲットとなる性別・年齢層をさらに特定することができそうですね。

 
それではプログラムの説明に入ります。
 

dataset1=np.random.normal(30, 8, 100) # (1)データの格納(男性)
dataset2=np.random.normal(25, 10, 100) # (2)データの格納(女性)

(1)(2)ともに、先ほどと同様np.random.normalを利用して、正規分布にしたがった乱数を100個作成しています。そして変数dataset1、dataset2にデータを格納しています。

 

plt.hist(dataset1, alpha=0.5, bins=20, label="Man") # (3) ヒストグラムの描画(男性)

(3)では、histに変数dataset1を渡して男性データ分のヒストグラムを描画しています。引数alphaで透明度を上げています。引数binsには20を指定して、ヒストグラムの棒の数を20にしています。また (5)の凡例の表示に使えるよう、引数labelに"Man”を渡しています。

 

plt.hist(dataset2, alpha=0.3, bins=20, label="Woman",
                    color='r') # (4) ヒストグラムの描画(女性)

(4)では、histに変数dataset2を渡して女性データ分のヒストグラムを引数color=”r”(赤色)で描画しています。引数labelに"Woman”を渡しています。引数alpha、binsは(5)と同様です。

 

plt.legend(loc="upper left", fontsize=13) # (5)凡例表示

(5)では、legendで凡例を表示しています。その時に表示されるラベルは(3)、(4)でlabelとして指定したものになります。引数fontsizeでラベルの文字サイズを指定します。
 
また引数locでは凡例の表示位置を指定しており、次の位置を指定できます。

表示位置locの指定内容
右上upper right
右下lower right
左上upper left
左下lower left

 
 

CSVファイルを読み込み、Matplotlibでヒストグラムの描画

前の例では、必要な売上や温度のデータは、NumPyのarrayに直接入力していましたが、実務では、これらのデータはCSVファイルなどのテキストファイルから読み込むことが多いです。今度の例では、CSVファイルから読み込んだデータを元にヒストグラムを描いてみましょう。

 
ここではあるスーパーマーケットチェーンの買い物客毎の購入金額(円)を格納したCSVファイル「Sales_Area_A.csv」(※csvファイルは上のリンクより取得下さい。)をPandasというライブラリを用いて読み込みます。

 
Pandasについては、「Pandasでデータ分析(インストールから使い方まで)」をご参照ください。

 
それではプログラムを見ていきます。

 

グラフの下に表示されているのが購入金額の範囲で、横軸に表示されているのが頻度になります。このようなヒストグラムを表示することで、それぞれの購入金額の範囲毎に、どのくらいの頻度があるのか、一目瞭然となります。

平均値約800円近くの購入頻度はほとんど無く、600円の前後と、1050円の前後の頻度が高いようです。

それではプログラムを解説していきます

import pandas as pd #(1) Pandasのインポート

Matplotlibに加えて、ここではPandasも利用するのでインポートします。

 

sales = pd.read_csv("Sales_Area_A.csv", squeeze = True) #(2) csvファイルの読み込み

次にCSVファイル「Sales_Area_A.csv」からデータを読み込みます。CSVファイルの読み込みは、pd.read_csvを利用します。
 
その際に引数として読み込むファイル名「Sales_Area_A.csv」と、squeezeにTrue(Seriesとしてデータを読み込む)を指定します。この読み込んだデータを変数salesに格納します。
 
CSVファイル読み込みの詳しい説明は、「Pandas Excel、CSVファイルの読み込み、書き込み」を参照ください。

 
残りのプログラムは今までと同様です。最後に変数salesをhistに渡して、ヒストグラムを描画しています。

plt.hist(sales) #(3) ヒストグラムの描画

 
PandasとMatplotlibのヒストグラムを用いたデータ分析事例の詳細は、次の記事の最後をご確認ください。

 
 

動画教材紹介私(清水 義孝)が作成したコース「Pythonによるビジネスに役立つWebスクレイピング」(Udemyへのリンク)が新発売!今なら期間限定で89%オフ!!!

ヒストグラムの日本語対応

Matplotlibでは、標準では日本語対応がされておらず、ヒストグラムなどのグラフのタイトルやラベルは英語でしか表記できません。日本語を無理に表示しようとすると、文字化けが発生し、「□□□」のような文字が表示されるだけで、正しく表示できません。

 
以下の記事では、Python初心者でも簡単にできる日本語対応の仕方を解説していきます。

 
またここでは、参考までに日本語化の例を載せておきます。詳細は、上の記事をご参考ください。コメントに「*日本語対応」を付けた箇所が今回の日本語対応の為に変更した箇所になります。

 
地域Bのデータとして、CSVファイル「Sales_Area_B.csv」からデータを読み込み、地域Aのデータと合わせてヒストグラムを表示しています。

Pythonのヒストグラムの例1

グラフのタイトルやラベル、凡例などが日本語化されているのが確認できました。

 
 

ヒストグラムを保存する方法

ヒストグラムのグラフの画像を保存したい場合、次のように記述します。

plt.savefig(“ファイル名”)

※注意点として、plt.show()で画面に表示する場合、上記の文を先に記述してください。順番が逆になると空白の画像が保存される可能性があります。

 
 
例えば先ほどJupyter notebookに表示したヒストグラムをPNG形式でファイル名”histogram.png”で保存してみましょう。先ほど記述したコードのplt.show()の前にplt.savefig()を追記して下さい。

 
保存された”histogram.png”を開くと、画面に表示された画像と同じものが表示されました。

Pythonのヒストグラムの例1

このようにして、作成したグラフを保存することもできます。

 
 

Matplotlibで複数のグラフを並べて描画

複数のヒストグラムを比較できるよう並べて表示したり、またヒストグラムと散布図や棒グラフなど他のグラフと並べて表示する方法は、以下のリンクをご参照ください。

 
 
 
関連記事です。
折れ線グラフについても確認しましょう。
 
棒グラフ、積み上げ棒グラフの描き方については、こちらが参考になります。
 
円グラフの描き方については、こちらをご覧ください。

 






まとめ記事

1

Python3におけるWEBスクレイピングのやり方について初心者向けに解説した記事です。   Requests、Beautiful Soup、Selenium、Pandas、newspape ...

2

Pythonの基本的なトピックについて、チュートリアル形式で初心者向けに解説した記事です。プログラミング未経験者や初心者でもわかりやすいよう、丁寧に解説しています。   Pythonでデータ ...

3

Pandas(パンダス)とは、データを効率的に扱うために開発されたPythonのライブラリの1つで、データの取り込みや加工・集計、分析処理に利用します。   Pandasには2つの主要なデー ...

4

データ分析、機械学習、ディープラーニングにはグラフの描画による可視化は不可欠です。データは、加工前の状態ではただの数字の羅列でしかなく、一目で必要な情報が伝わるものではありません。それを集計しグラフに ...

5

NumPy(ナンパイ)は、数値計算を効率的に行うための拡張ライブラリです。ベクトルや行列などを効率的に数値計算するための数学関数ライブラリを提供します。NumPyを使うことにより、数値計算をより早く、 ...

-17. Matplotlibでグラフの描画

Copyright© AI-interのPython3入門 , 2020 All Rights Reserved.