グラフ描画
ヒストグラム、棒グラフ、折れ線グラフ、箱図、ヴァイオリン図、散布図の描画スクリプト例を用意した。これらのスクリプトをJupyterで実行するときは、「%matplotlib inline」の1行を追加する必要があるが、このことの説明のウェブサイトを用意している(現在2020.0702は%matplotlib inlineが無くても表示されるようである)。描画スクリプト例のファイルを圧縮ファイルGraphsFiles.zipとしてまとめた。ダウンロード・解凍して、自由に利用されたい。
なお、<岡本安晴「いまさら聞けないPythonでデータ分析」丸善出版>で、グラフ描画の説明を行っている。
表A.1のテストの点数のデータの分布をヒストグラムで描いてみる。
表A.1 テストの点数
66 |
59 |
62 |
64 |
63 |
68 |
65 |
59 |
68 |
64 |
65 |
51 |
67 |
64 |
83 |
59 |
61 |
62 |
57 |
72 |
65 |
64 |
54 |
60 |
53 |
65 |
67 |
60 |
53 |
79 |
74 |
53 |
61 |
68 |
75 |
50 |
57 |
55 |
66 |
56 |
55 |
61 |
70 |
71 |
49 |
69 |
70 |
80 |
73 |
72 |
Pythonスクリプトは以下のようになる。リストdataに表A.1のデータが設定されている。
import matplotlib.pyplot as plt
data = [
66,59,62,64,63,68,65,59,68,64,
65,51,67,64,83,59,61,62,57,72,
65,64,54,60,53,65,67,60,53,79,
74,53,61,68,75,50,57,55,66,56,
55,61,70,71,49,69,70,80,73,72
]
plt.hist(data)
plt.show()
実行すると、図A.1のグラフが表示される。
図A.1
保存ボタンを押して保存した後、閉じるボタンを押して閉じると、プログラムの実行終了となる。実行終了後、保存した画像ファイルはワードなどに取り込むことができる。ワードの場合、直接保存した画像ファイルを挿入するのではなく、一旦ペイントで開いてから、コピー・貼り付けで取り込む方が綺麗である。図A.2は、ペイントで開いた画像ファイルをコピー・貼り付けでワードに取り込み、「点数」と「度数」のラベルを張り付けたものである。
図A.2
平成7年の国勢調査のデータを表B.1に示す。
表B.1 平成7年国勢調査
地域 |
東京都 |
鹿児島県 |
鳥取県 |
|
人口(万人) |
1177.4 |
179.4 |
61.5 |
78.1 |
表B.1の棒グラフを描くPythonスクリプトを以下のように用意した。
import matplotlib.pyplot as plt
xlabels = ['Tokyo', 'Kagoshima',
'Tottori', 'Setagaya']
yvalues = [1177.4, 179.4, 61.5, 78.1]
plt.bar(range(4), yvalues, tick_label
= xlabels)
plt.show()
上のスクリプトを実行すると、図B.1のように棒グラフが描かれる。
図B.1
棒グラフを描く関数
plt.bar(range(4), yvalues, tick_label = xlabels)
において、1番目の引数range(4)は棒の位置を与えるものである。N本の棒を描くときはrange(N)としておけば、たいていの場合はよい。第2引数yvaluesは各棒の高さである。引数tick_label = xlabelsは各棒の下に記すラベルである。
東京都の人口推移は表C.1に示すようになっている。
表C.1 東京都の人口の推移。
東京都ホームページ(平成18年11月25日)による。
年次 |
人口(人) |
1880 |
959,596 |
1900 |
2,014,100 |
1920 |
3,699,428 |
1940 |
7,354,971 |
1960 |
9,683,802 |
1980 |
11,618,281 |
2000 |
12,064,101 |
表C.1の折れ線グラフを描くスクリプトを以下のように用意した。
import matplotlib.pyplot as plt
year = [1880, 1900, 1920, 1940, 1960, 1980,
2000]
population = [959596, 2014100,
3699428, 7354971, 9683802, 11618281, 12064101]
plt.plot(year, population, 'b-')
plt.show()
表C.1のスクリプトを実行すると図C.1のグラフが描かれる。
図C.1
図の左上に表示されている1e7はを意味していて、縦軸の単位が
であることを表している。
折れ線を描く関数の呼び出し
plt.plot(year, population, 'b-')
において、第1引数は横軸、第2引数は縦軸のデータであり、それぞれ対応する順番に並んでいる。第3引数'b-'はプロットの仕方を指定するもので、小文字bは青を、マイナス記号−は実線で描くことを意味している。詳しくは拙著<岡本安晴「いまさら聞けないPythonでデータ分析」丸善出版>で説明している。
表D.1のデータの箱図を描く。
表D.1 グループAのデータ |
65 67 67 67 60 65 56 61 67 74 73 59 72 69 69 82 75 67 65 69 |
箱図を描くスクリプトは以下のようになる。
import matplotlib.pyplot as plt
import seaborn as sb
data = [65, 67, 67, 67, 60, 65, 56,
61, 67, 74,
73,
59, 72, 69, 69, 82, 75, 67, 65, 69]
sb.boxplot(data)
plt.show()
表D.1のデータをリストdataに設定して関数boxplotを呼び出している。実行すると図D.1の箱図が描かれる。
図D.1
箱を縦向きで描くときは、関数boxplotの引数にorient = ‘v’を追加して、次のようにする。
import matplotlib.pyplot as plt
import seaborn as sb
data = [65, 67, 67, 67, 60, 65, 56,
61, 67, 74,
73,
59, 72, 69, 69, 82, 75, 67, 65, 69]
sb.boxplot(data, orient = 'v')
plt.show()
実行すると、図D.2のように縦向きで描かれる。
図D.2
表D.1のデータに加えて、次の表D.2のデータも一緒に箱図を描くとする。
表D.2 グループBのデータ |
84 84 75 67 81 90 75 79 77 72 73 70 80 88 79 84 76 76 76 90 |
このときのスクリプトは以下のようになる。
import matplotlib.pyplot as plt
import seaborn as sb
data1 = [65, 67, 67, 67, 60, 65, 56,
61, 67, 74,
73,
59, 72, 69, 69, 82, 75, 67, 65, 69]
group1 = ['A', 'A', 'A', 'A', 'A',
'A', 'A', 'A', 'A', 'A',
'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A']
data2 = [84, 84, 75, 67, 81, 90, 75,
79, 77, 72,
73, 70, 80, 88, 79, 84, 76, 76, 76, 90]
group2 = ['B', 'B', 'B', 'B', 'B',
'B', 'B', 'B', 'B', 'B',
'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B']
sb.boxplot(x = group1 + group2, y =
data1 + data2)
plt.show()
それぞれのグループのデータをリストdata1とリストdata2に設定し、各データ値の所属するグループを示す文字をリストgroup1とgroup2に設定している。箱図を描く関数を横軸がグループの所属を示す変数であることを引数
x = group1 + group2
で示し、縦軸がデータ値であることを引数
y = data1 + data2
で示している。
上のスクリプトを実行すると図D.3の箱図が表示される。
図D.3
箱を横向きで描くときは、以下のようにする。
import matplotlib.pyplot as plt
import seaborn as sb
data1 = [65, 67, 67, 67, 60, 65, 56,
61, 67, 74,
73,
59, 72, 69, 69, 82, 75, 67, 65, 69]
group1 = ['A', 'A', 'A', 'A', 'A',
'A', 'A', 'A', 'A', 'A',
'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A']
data2 = [84, 84, 75, 67, 81, 90, 75,
79, 77, 72,
73, 70, 80, 88, 79, 84, 76, 76, 76, 90]
group2 = ['B', 'B', 'B', 'B', 'B',
'B', 'B', 'B', 'B', 'B',
'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B']
sb.boxplot(x = data1 + data2, y = group1
+ group2, orient = 'h')
plt.show()
横軸と縦軸の指定を箱が横向きであることに合わせて
x = data1 + data2, y = group1 + group2
とし、方向を
orient = 'h'
と明示する。このとき、横向きの図D.4の箱図が描かれる。
図D.4
表E.1のデータのヴァイオリン図を描く。
表E.1 グループAのデータ |
65 67 67 67 60 65 56 61 67 74 73 59 72 69 69 82 75 67 65 69 |
ヴァイオリン図を描くスクリプトは以下のようになる。
import matplotlib.pyplot as plt
import seaborn as sb
data = [65, 67, 67, 67, 60, 65, 56,
61, 67, 74,
73,
59, 72, 69, 69, 82, 75, 67, 65, 69]
sb.violinplot(data)
plt.show()
表E.1のデータをリストdataに設定して関数violinplotを呼び出している。実行すると図E.1のヴァイオリン図が描かれる。
図E.1
ヴァイオリンを縦向きで描くときは、関数boxplotの引数にorient = ‘v’を追加して、次のようにする。
import matplotlib.pyplot as plt
import seaborn as sb
data = [65, 67, 67, 67, 60, 65, 56,
61, 67, 74,
73,
59, 72, 69, 69, 82, 75, 67, 65, 69]
sb.violinplot(data, orient = 'v')
plt.show()
実行すると、図E.2のように縦向きで描かれる。
図E.2
紐図を重ねるスクリプトは、次のようになる。
import matplotlib.pyplot as plt
import seaborn as sb
data = [65, 67, 67, 67, 60, 65, 56,
61, 67, 74,
73,
59, 72, 69, 69, 82, 75, 67, 65, 69]
sb.violinplot(data, orient = 'v')
sb.stripplot(data, color = 'm', orient
= 'v')
plt.show()
2つの関数violinplotとstripplotを実行すればよい。このとき、図E.3のようなグラフになる。
図E.3
表E.1のデータに加えて、次の表E.2のデータも一緒にヴァイオリン図と紐図を描くとする。
表E.2 グループBのデータ |
84 84 75 67 81 90 75 79 77 72 73 70 80 88 79 84 76 76 76 90 |
このときのスクリプトは以下のようになる。
import matplotlib.pyplot as plt
import seaborn as sb
data1 = [65, 67, 67, 67, 60, 65, 56,
61, 67, 74,
73,
59, 72, 69, 69, 82, 75, 67, 65, 69]
group1 = ['A', 'A', 'A', 'A', 'A',
'A', 'A', 'A', 'A', 'A',
'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A']
data2 = [84, 84, 75, 67, 81, 90, 75,
79, 77, 72,
73, 70, 80, 88, 79, 84, 76, 76, 76, 90]
group2 = ['B', 'B', 'B', 'B', 'B',
'B', 'B', 'B', 'B', 'B',
'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B']
sb.violinplot(x = group1 + group2, y =
data1 + data2)
sb.stripplot(x = group1 + group2, y =
data1 + data2, color = 'm')
plt.show()
それぞれのグループのデータをリストdata1とリストdata2に設定し、各データ値の所属するグループを示す文字をリストgroup1とgroup2に設定している。箱図を描く関数を横軸がグループの所属を示す変数であることを引数
x = group1 + group2
で示し、縦軸がデータ値であることを引数
y = data1 + data2
で示している。
上のスクリプトを実行すると図E.4の箱図が表示される。
図E.4
ヴァイオリンと紐を横向きで描くときは、以下のようにする。
import matplotlib.pyplot as plt
import seaborn as sb
data1 = [65, 67, 67, 67, 60, 65, 56,
61, 67, 74,
73,
59, 72, 69, 69, 82, 75, 67, 65, 69]
group1 = ['A', 'A', 'A', 'A', 'A',
'A', 'A', 'A', 'A', 'A',
'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A']
data2 = [84, 84, 75, 67, 81, 90, 75,
79, 77, 72,
73, 70, 80, 88, 79, 84, 76, 76, 76, 90]
group2 = ['B', 'B', 'B', 'B', 'B',
'B', 'B', 'B', 'B', 'B',
'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B']
sb.violinplot(x = data1 + data2, y =
group1 + group2, orient = 'h')
sb.stripplot(x = data1 + data2, y =
group1 + group2, orient = 'h')
plt.show()
横軸と縦軸の指定を箱が横向きであることに合わせて
x = data1 + data2, y = group1 + group2
とし、方向を
orient = 'h'
と明示する。このとき、横向きの図E.5の箱図が描かれる。
図E.5
国語と英語の得点が表F.1のようであったとする。
表F.1 2教科[国語、英語]のスコア |
[79, 72]
[77, 70] [74,
75] [53, 44] [76, 52] [68, 60]
[96, 96] [85,
71] [74, 49] [93, 80] [54, 55]
[86, 70] [89,
96] [87, 87] [81, 81] [84, 85]
[78, 64] [76,
53] [54, 57] [75, 60] |
この散布図を描くためのスクリプトを以下のように用意した。
import matplotlib.pyplot as plt
data = [
[79,
72], [77, 70], [74, 75], [53, 44], [76, 52],
[68,
60], [96, 96], [85, 71], [74, 49], [93, 80],
[54,
55], [86, 70], [89, 96], [87, 87], [81, 81],
[84,
85], [78, 64], [76, 53], [54, 57], [75, 60]
]
A = []
B = []
for v in data:
A.append(v[0])
B.append(v[1])
plt.rcParams['font.family'] = \
['Yu Gothic', 'Noto Sans CJK
JP', 'Hiragino Maru Gothic Pro'] # 日本語表示用
plt.title('散布図', fontsize = 20)
plt.scatter(A, B)
plt.xlabel('国語', fontsize = 16)
plt.ylabel('英語', fontsize = 16)
plt.show()
日本語が表記できるように、日本語用フォントの設定が次のコードで行われている。
plt.rcParams['font.family'] = \
['Yu Gothic', 'Noto Sans CJK
JP', 'Hiragino Maru Gothic Pro'] # 日本語表示用
上のコードで指定したフォントから使用可能なものによって日本語が表示される。
国語の得点をリストAに、英語の得点をリストBに設定して、散布図を描く関数を
plt.scatter(A, B)
と呼び出している。横軸、縦軸にラベルを表示するための関数を
plt.xlabel('国語', fontsize = 16)
plt.ylabel('英語', fontsize = 16)
と呼び出している。
上のスクリプトを実行すると、散布図が図F.1のように描かれる。
図F.1