Python製可視化ライブラリBokehを使って、散布図(scatter plot)を作成する例を紹介します。データには、有名なiris(アヤメ)データを使用します。
BokehのGitHubリポジトリで公開されているサンプルコードをベースにしています。
備考
Bokehやそのドキュメント等のライセンスについては、「Bokehのライセンス」に記載しています。
1. 前提としている環境
この記事では、下記の環境を前提としています。
- Python : Ver.3.5.2
- Bokeh : Ver.0.12.6
2. 実行するコードと結果のグラフ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | from bokeh.plotting import figure, show, output_file
from bokeh.sampledata.iris import flowers
colormap = {'setosa': 'red', 'versicolor': 'green', 'virginica': 'blue'}
colors = [colormap[x] for x in flowers['species']]
p = figure(title = "Iris Morphology")
p.xaxis.axis_label = 'Petal Length'
p.yaxis.axis_label = 'Petal Width'
p.circle(flowers["petal_length"], flowers["petal_width"],
color=colors, fill_alpha=0.2, size=10)
output_file("iris.html", title="iris.py example")
show(p)
|
3. 解説
3.1. 必要なモジュールのインポート
1行目では、必要なモジュールのインポートをしています。
1 | from bokeh.plotting import figure, show, output_file
|
3.2. サンプルデータのインポート
2行目では、サンプルデータをインポートしています。
2 | from bokeh.sampledata.iris import flowers
|
type(flowers)を実行してみると分かりますが、flowersはpandasのDataFrameオブジェクトです。150行のrowと5列のcolumnからできています。
sepal_length | sepal_width | petal_length | petal_width | species | |
---|---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 | setosa |
1 | 4.9 | 3.0 | 1.4 | 0.2 | setosa |
2 | 4.7 | 3.2 | 1.3 | 0.2 | setosa |
3 | 4.6 | 3.1 | 1.5 | 0.2 | setosa |
4 | 5.0 | 3.6 | 1.4 | 0.2 | setosa |
... | ... | ... | ... | ... | ... |
145 | 6.7 | 3.0 | 5.2 | 2.3 | virginica |
146 | 6.3 | 2.5 | 5.0 | 1.9 | virginica |
147 | 6.5 | 3.0 | 5.2 | 2.0 | virginica |
148 | 6.2 | 3.4 | 5.4 | 2.3 | virginica |
149 | 5.9 | 3.0 | 5.1 | 1.8 | virginica |
150 rows × 5 columns
sepalは花のがく片、petalは花弁のことで、それぞれの幅と長さのデータがcolumnになっています。このデータは、Edgar AndersonとRonald Aylmer Fisherの研究によって発表された有名なデータです[1]。speciesカラムにはアヤメの種類を表す文字列(setosa、versicolor、virginica)が入っています。
3.3. アヤメの品種ごとに色を設定する
3、4行目では、リストの内包表記を使って150行分の色名が入ったリストcolorsを作成しています。
4 5 | colormap = {'setosa': 'red', 'versicolor': 'green', 'virginica': 'blue'}
colors = [colormap[x] for x in flowers['species']]
|
colorsの中身は、['red', 'red', ... 'green', 'green', ... 'blue', 'blue']のようにred、green、blueのいずれかの色名が、全部で150要素並んでいます。
アヤメの品種がsetosaの場合は赤、versicolorの場合は緑、virginicaの場合は青を指定しています。
3.4. Figureオブジェクトを作成
7行目では、Figureオブジェクトを作成しています。引数にはグラフのタイトルを渡しています。
7 | p = figure(title = "Iris Morphology")
|
3.5. X・Y軸のラベルを設定
8、9行目では、X軸とY軸のラベルを設定しています。これらは、7行目でfigureの引数として渡して設定することもできます。
8 9 | p.xaxis.axis_label = 'Petal Length'
p.yaxis.axis_label = 'Petal Width'
|
3.6. プロット
11行目で、Figureオブジェクトに円をプロットしています。
11 12 | p.circle(flowers["petal_length"], flowers["petal_width"],
color=colors, fill_alpha=0.2, size=10)
|
3.7. HTMLファイルに出力
14行目でファイル名とタイトルを指定して、16行目で出力しています。
14 15 16 | output_file("iris.html", title="iris.py example")
show(p)
|