Help us understand the problem. What is going on with this article?

matplotlibのbarプロットでカラーバーをつける方法

More than 1 year has passed since last update.

はじめに

matplotlibでbarプロットを行うと,Mappableオブジェクトが返ってこないため,カラーバーをつけることができない.

>>> import matplotli.pyplot as plt
>>> plt.bar(0, 1)
<Container object of 1 artists>

でも,なんとかしてカラーバーをつけたい!ということで,やってみた.

0. 適当なデータを作る

まず初めに,適当なデータを作ってみる.
ここでは,高さ1~3のバーを積み上げたような図を作成することを想定して,データを作る.

>>> import numpy as np
>>> dheight = np.random.choice([1, 2, 3], size=10)
>>> data = np.random.choice([1, 2, 3, 4, 5], size=dheight.size)
>>> print data
[1 1 1 4 5 2 1 2 2 4]

今回は,ここで作成したdataという変数の値に応じて色を付けていくということを行う.

適当なデータを作ったので,いよいよ作図に入る.

1. Normalize関数を作る

まず,matplotlibのカラーバーは,0~1の間の値に対応してカラーマップに色が定義されている.したがって,今回のような1~5の値に応じて色を塗りたい場合は,標準化するための関数(のようなオブジェクト)が必要となる.それを作成できるのが,Normalizeというクラスである.

>>> from matplotlib.colors import Normalize
>>> norm = Normalize(vmin=data.min(), vmax=data.max())
>>> print norm(1), norm(2), norm(3)
0.0 0.25 0.5

実際に値を入れてみると分かるように,このnormというオブジェクトに値を与えると,確かにvminが0,vmaxが1となるように標準化されている.

2. Mappableオブジェクトの作成

次に,Mappableオブジェクトを作成する.
今回は,matplotlibのデフォルトのカラーマップであるjetに合わせてMappableを作る.

>>> from matplotlib.cm import ScalarMappable, get_cmap
>>> cmap = get_cmap('jet')
>>> mappable = ScalarMappable(cmap=cmap, norm=norm)
>>> mappable._A = []

3. データをプロットする

ここまで準備ができたら,いよいよ実際にデータをプロットできる.

>>> import matplotlib.pyplot as plt
>>> bottom = 0.
>>> for dh, v in zip(dheight, data):
...     plt.bar(0, dh, width=1, bottom=bottom, color=cmap(norm(v)))
...     bottom += dh
>>> cbar = plt.colorbar(mappable)

今回プロットしたデータは[1 1 1 4 5 2 1 2 2 4]なので,この値に対応した色がカラーバーにあれば,問題なくカラーバーを描けたことになる.

4. ラベルを付ける

最後に,ラベルを付けて完成となる.
今回は,データの最小値から最大値の間を5つに区切ってラベルを貼り付けていく.

>>> cbar = plt.colorbar(mappable)
>>> ticks = np.linspace(norm.vmin, norm.vmax, 5)
>>> cbar.set_ticks(ticks)
>>> cbar.ax.set_yticklabels([str(s) for s in ticks])
[<matplotlib.text.Text at 0x7f36ac9b01d0>,
 <matplotlib.text.Text at 0x7f36ac9bb850>,
 <matplotlib.text.Text at 0x7f36ac98e550>,
 <matplotlib.text.Text at 0x7f36ac98ec50>,
 <matplotlib.text.Text at 0x7f36ac996390>]

5. 完成!

以上で完成である.

>>> plt.show()

index.png

無事,[1 1 1 4 5 2 1 2 2 4]の値に対応した色が描かれた.

参考になったページ

ykatsu111
雪と雲を眺める簡単なお仕事をしています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした