matplotlibで2軸グラフと標準偏差付きのグラフを書く

研究で使用したので、自分用のメモで。ここらへんを参考にしてみた。

http://chick.g.hatena.ne.jp/allegro/20091010/p5
http://matplotlib.org/examples/api/fahrenheit_celcius_scales.html
http://matplotlib.org/examples/pylab_examples/errorbar_demo.html
http://www.comp.tmu.ac.jp/shintani/japanese/openUniversity/node31.html
http://w.livedoor.jp/met-python/d/matplotlib#content_5_14

個人的に軸やラベルのフォントサイズがどうにかしたかったので、試行錯誤してたらこんなんでうまく行った。

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt

parameter_list = [(dim, kids_rate) for dim in [2, 3, 5, 10, 20, 50] for kids_rate in [6, 10, 20, 50, 100]]

for dimension, kids_rate in parameter_list:

    #prepare for data
    data_set = [map(float, line.strip().split(",")) for line in open("../result_d%d_kr%d.txt" % (dimension, kids_rate)).readlines()]
    Crs = [item[0] for item in data_set]
    successRates = [item[1] for item in data_set]
    means = [item[2] for item in data_set]
    variances = [item[3] for item in data_set]

    #prepare for plot
    fig = plt.figure()
    ax1 = fig.add_subplot(111)
    ax2 = ax1.twinx()

    fs_num = 16
    ax1.errorbar(Crs, means, fmt='-r', yerr=[variances, variances], lw = 4)
    plt.setp(ax1.get_xticklabels(), fontsize=fs_num, visible=True)
    plt.setp(ax1.get_yticklabels(), fontsize=fs_num, visible=True)
    ax2.plot(Crs, successRates, '-b', lw = 4)
    plt.setp(ax2.get_yticklabels(), fontsize=fs_num, visible=True)
    
    fs_label = 20
    ax1.set_xlabel('Cr', fontsize = fs_label)
    ax1.set_ylabel('# of generation', fontsize = fs_label)
    ax1.set_xlim(0.0, 0.9)
    ax2.set_ylabel('success rate', fontsize = fs_label)
    ax2.set_ylim(0.8, 1.0)
    ax1.grid(True)
    plt.savefig('graph_d%d_kr%d.eps' % (dimension, kids_rate))
    plt.clf()

実際のグラフはこんな感じ。

重要なのは、ax1.set_xlabelとかplt.setpあたりで、ここでフォントサイズの調整をしてる。
かなり無理やりな感じもあるが、上手くいったからしばらくこれでやってみる。