tak0kadaの何でもノート

発声練習、生存確認用。

医学関連は 医学ノート

積み上げ棒グラフ - 「マンガでわかる統計学」第3章

カテゴリーデータを扱う。カテゴリーデータを可視化するときにも棒グラフは使える。

うどん ラーメン そうめん そば
40% 30% 20% 10%

を表示したかったが、現状python3に移行できていないのでラベルはa,b,c,dにする。

縦棒グラフの場合

from __future__ import division
import numpy as np

label = ['a','b','c','d']
data = np.array([40, 30, 20, 10])

def bar_plot(data, label):
    import matplotlib.pyplot as plt

    data = data/data.sum()*100
    color = map(lambda x: str(x/data.shape[0]), range(data.shape[0]))

    offset = 0
    for i in range(data.shape[0]):
        #plt.bar(left, height, width=0.8, bottom=None, hold=None, **kwargs)
        plt.bar(0, data[i], width=0.2, bottom=offset, color=color[i], label=label[i])
        offset += data[i]

    plt.xlim(-0.1,0.3)
    plt.tick_params(labelbottom="off")
    plt.ylabel('%')
    plt.legend()
    plt.show()

bar_plot(data, label)

f:id:kuyata:20140601212451p:plain

横棒グラフの場合

def barh_plot(data, label):
    import matplotlib.pyplot as plt

    data = data/data.sum()*100
    color = map(lambda x: str(x/data.shape[0]), range(data.shape[0]))

    offset = 0
    for i in range(data.shape[0]):
        #plt.barh(bottom, width, height=0.8, left=None, hold=None, **kwargs)
        plt.barh(0, data[i], height=0.2, left=offset, color=color[i], label=label[i])
        offset += data[i]

    plt.ylim(-0.1,0.35)
    plt.tick_params(labelleft="off")
    plt.xlabel('%')
    plt.legend()
    plt.show()

barh_plot(data, label)

f:id:kuyata:20140601212529p:plain

もうちょっといい可視化をしたい。具体的には、上下左右の余計なスペースを削って凡例をグラフ外に移動するなど。同様の可視化をするときにはlegend_guideを読んで改善する。