2017年10月22日日曜日

【円グラフ】matplotlibを使ってデータを視覚化する

グラフ作りはEXCELよりも簡単⁈

pythonでグラフを作る場合、はじめはコードを書く手間ひまが掛かりますが、いったん作ればその後はデータを変更するだけでいいので、何度も繰り返すような作業ではEXCELよりも効率的です。

データベースからデータを読み込んだ後たったの7行で円グラフが完成。



import pandas as pd
import matplotlib.pyplot as plt
import psycopg2,sys

def SQL_readData(year) :
    
    sql = 'SELECT result,COUNT(*) FROM sample_1 '
    sql = sql + "WHERE DATE_PART('YEAR',date) = '"  
    sql = sql + year
    sql = sql + "' GROUP BY result "
    sql = sql + "ORDER BY result ;"
    
    return sql


def execute_SQL(SQL) :
    
    try :        
        conn = psycopg2.connect(database="ddddd", user="uuuuuu", password="xxxxxx", host="127.0.0.1", port="oooo")    
        results = pd.read_sql(SQL,conn)        
        return results        
    except psycopg2.OperationalError as e:        
        print('Unable to connect!\n{0}').format(e)
        sys.exit(1)    
    finally:
        if conn:
            conn.close()
            
if __name__ == '__main__':

    SQL = SQL_readData('2016')
    readData = execute_SQL(SQL)

    labels = ['6号艇', '5号艇', '4号艇','3号艇','2号艇','1号艇']
    sizes = [readData.at[5,'count'], readData.at[4,'count'], readData.at[3,'count'], readData.at[2,'count'],readData.at[1,'count'],readData.at[0,'count']]
    colors = ['#FDF2E9', '#FAE5D3', '#F5CBA7', '#F0B27A','#EB984E','#E67E22']

    fig1, ax1 = plt.subplots()
    ax1.pie(sizes, labels=labels, autopct='%1.1f%%', colors=colors, startangle=90)
    ax1.axis('equal')  # Equal aspect ratio ensures that pie is drawn as a circle.

    plt.savefig('graph/foo.png')
    


グラフの装飾も以下の通り可能です。


            
if __name__ == '__main__':

    SQL = SQL_readData('2016')
    readData = execute_SQL(SQL)

    explode = ( 0,0,0,0.2,0,0) ←3号艇を強調

    labels = ['6号艇', '5号艇', '4号艇','3号艇','2号艇','1号艇']
    sizes = [readData.at[5,'count'], readData.at[4,'count'], readData.at[3,'count'], readData.at[2,'count'],readData.at[1,'count'],readData.at[0,'count']]
    colors = ['#FDF2E9', '#FAE5D3', '#F5CBA7', '#F0B27A','#EB984E','#E67E22']

    fig1, ax1 = plt.subplots()
    ax1.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%', colors=colors, startangle=90,shadow=True,pctdistance=0.8, labeldistance=1.1)
    ax1.axis('equal')  # Equal aspect ratio ensures that pie is drawn as a circle.
    plt.rcParams['font.size'] = 11.0 ← フォントのサイズを変更
    plt.title("1着の号艇の割合", loc='right') ← タイトルを追加
    plt.rcParams['axes.titlesize'] = 14.0 ← タイトルのサイズ指定
    
    plt.savefig('graph/foo.png')