Python + XlsxWriterでExcelのグラフ作成を行います。 そして、Excelのデフォルトのグラフは見栄えが余り良くありませんのでグラフの体裁を整えてゆきます。
Pythonでデータ解析を行っていても、データをExcel形式で残さなくてならない面倒な場合があるかもしれません。しかし、XlsxWriterでExcelのグラフ作成を行ってしまえば、データ解析から結果の保存までPythonで自動化・完結出来てしまいます。
XlsxWriterはExcelの全てをカバーできている訳ではありませんが、大抵のことは出来てしまいますので、是非覚えて使いこなして下さい。
Excelファイルへ書き込み
今回、Excelファイルの作成にはPandasを使用し、書き込みエンジンにXlsxWriterを指定します。
import xlsxwriter
import numpy as np
import pandas as pd
import os
X = np.arange(-100, 101, 20)
Y = X*2
#データフレーム作成
data = pd.DataFrame({'X1': X, 'Y1': Y})
filename = "~/xlsxwriter_chart.xlsx"
#ファイル名は絶対パスで記述
filename = os.path.expanduser(filename)
#writerオブジェクトの生成
writer = pd.ExcelWriter(filename, engine='xlsxwriter')
#Excelへ書き込み
data.to_excel(writer, sheet_name='sheet01', header=True, index=False, startrow=0, startcol=0)
グラフの作成
Excelファイルへ書き込みが出来たら、次はグラフを作成します。今回は、散布図(平滑線)を作成します。
XlsxWriterでのグラフ作成の基本手順は以下の通りです。
- workbook.add_chart() でチャートオブジェクトの生成
- chart.add_series()で系列の追加
- worksheet.insert_chart() でチャートの挿入
ソースコード例
#チャートオブジェクトの生成
chart1 = workbook.add_chart({'type': 'scatter', 'subtype': 'smooth'})
#系列の追加
#categories: [シート名, 開始行,開始列, 終了行, 終了列)
#value: [シート名, 開始行, 開始列, 終了行, 開始列)
#name [シート名, 選択行, 選択列]
# categories, values, nameの選択範囲に配列を用いるケース
chart.add_series({
'categories' : ["sheet01", 1, 0, 11, 0], #A2からA11を選択
'values' : ['sheet01', 1, 1, 11, 1], # B2からB11を選択
'line' : {'color': 'red', 'width': 1.5},
'name' :["sheet01", 0, 1] #B1を選択
'title' : None
})
#グラフの挿入位置を設定
worksheet = writer.sheets['sheet01']
#E4セルにグラフの左上が来るように設置される
worksheet.insert_chart('E4', chart)
#writerオブジェクトを閉じる
writer.close()
上のコードを実行すると、Excelに下図のようなグラフが表示されます。
ソースコードの解説
チャートオブジェクトの生成
チャートオブジェクトの生成はworkbook.add_chart()で行います。workbook.add_chart()にはグラフの‘type’と‘subtype‘を設定することが出来ます。
chart = workbook.add_chart('type': 'area', 'subtype': 'stacked)
XlsxWriterで設定可能なチャートタイプとサブタイプは下記の通りです。
type | subtype |
area | stacked |
percent_stacked | |
bar | stacked |
percent_stacked | |
column | stacked |
percent_stacked | |
scatter | straight_with_markers |
straight | |
smooth_with_markers | |
smooth | |
radar | with_markers |
filled | |
line | – |
pie | – |
doughnut | – |
系列の追加
chart.add_series()でデータの選択を行います。Excelでは下記画面で設定することに相当します。
categories(系列Xの値)、values(系列Yの値)、name(系列名)などの値(範囲)を設定可能です。chart_add_series()では、線の太さやチャートタイトル等も設定可能です。設定可能な項目はXlsxWriterのマニュアルを参照してください。
上のソースコードでは、categories、value、nameの値には配列を指定していますが、Excelでデータ範囲を選択する際に用いられる“=Sheet01!$A$2:$A$11“のような表記を渡しても構いません。すなわち、データの選択範囲は下記のように書くことも可能です。
chart.add_series({
'categories' : '=sheet01!$A$2:$A$12', #A2からA12を選択
'values' :=sheet01!$B$2:$B$12, # B2からB12を選択
'line' : {'color': 'red', 'width': 1.5},
'name' : '=sheet01!$B$1' #B1を選択
'title' : None
})
グラフの体裁を整える
Excelのデフォルトのグラフは見栄えが余り格好良くありません。そこで、チャートの体裁を整えます。今回は下記操作を行いチャートの体裁を整えます。
- chart.set_size()でグラフサイズの変更
- chart.set_chartarea()で グラフエリアの書式設定
- chart.set_title()でグラフタイトルの削除
- chart.set_plotarea()でプロットエリアの書式設定
- chart.set_legend()で凡例の位置変更
- chart.set_x_axis()、chart.set_y_axis()でX軸、Y軸の設定を変更
ソースコード例
先程のコードに下記コードを追加してグラフの体裁を整えます。
#グラフエリアのサイズ
chart.set_size({
'width': 400,
'height':400
})
#グラフエリアの設定
chart.set_chartarea({
'fill': {'none': True}
})
#グラフタイトルの設定
chart.set_title({
'none': True
})
#プロットエリアの設定
chart.set_plotarea({
'layout': {'x': 0.25, 'y': 0.1, 'width':0.75, 'height': 0.75},
'border': {'color': 'black', 'width':1.5},
'fill' : {'none': True}
})
#凡例の設定
chart.set_legend({
"position": 'top'
})
#X軸の設定
chart.set_x_axis({
'name': 'X', #ラベル名設定
'num_font': {'name': 'Arial', 'size': 14,}, #数値のフォント設定
'name_font':{'name': 'Arial', 'size': 14, 'bold': False, 'italic': True}, #ラベルのフォント設定
'min': -100, 'max': 100, #最小値、最大値の設定
'crossing' : -100, #軸の交点設定
'major_tick_mark' : 'inside', #主目盛の向き設定
'line': {'color': "black", 'width': 1.5} #軸の色と線の太さ設定
})
#Y軸の設定
chart.set_y_axis({
'name' : "Y",
'num_font': {'name': 'Arial', 'size': 14},
'name_font': {'name': 'Arial', 'size':14, 'bold': False, 'italic': True},
'min': -200, 'max': 200
'crossing' : -200,
'major_gridlines': {'visible': False},
'major_tick_mark' : 'inside',
'line': {'color': 'black', 'width': 1.5}
})
このコードを足した結果、チャートは下記のようになります。
ソースコードの解説
グラフサイズの設定
グラフサイズの設定はchart.set_size()で行います。chart.set_size()にはdictを渡します。設定したいプロパティをdictのキーに設定し、各キーに対応する数値を設定します。
chart.set_size()ではグラフの幅をwidthで、高さを lengthで指定します。単位はピクセルです。widthとlengthの代わりに、x_scaleとy_scaleを指定することも可能です。
#両者は同じ
chart.set_size({'width': 960, 'height': 864})
chart.set_size({'x_scale': 2, 'y_scale': 3})
上記の場合、デフォルトのチャートサイズ(幅480ピクセル x 高さ288ピクセル)に対して、幅を2倍(=960ピクセル)、高さを3倍(=864ピクセル)に設定しています。
グラフエリアの書式設定
グラフエリアの書式設定は chart.set_chartarea()Excelの 行います。Excelでは下記画面で設定することに相当します。
chart_set_chartarea()にはdictを渡します。設定したいプロパティをdictのキーに設定し、各キーに対応する値は、数値や文字列やdict、boolean等を設定します。
chart.set_chartarea()で設定可能なプロパティは以下の通りです。
- border : 枠線 (設定可能な値はこちらを参照)
- fill : 塗りつぶし (設定可能な値はこちらを参照)
- pattern : 塗りつぶし(パターン) (設定可能な値はこちらを参照)
- gradient : 塗りつぶし(グラディエーション) (設定可能な値はこちらを参照)
chart.set_plotarea({
'border': {'color': 'red', 'width': 1.5, 'dash_type': 'dash'},
'fill': {'color': '#FFFFC2'}
})
プロットエリアの書式設定
chart.set_plotarea()でExcelのプロットの書式設定を行います。Excelでは下記画面で設定することに相当します。
chart_set_chartarea()にはdictを渡します。設定したいプロパティをdictのキーに設定し、各キーに対応する値は、数値や文字列やdict等を設定します。
chart.set_chartarea()で設定可能なプロパティは、chart.set_plotarea()とほぼ一緒ですが、chart.set_chartarea()ではlayoutプロパティを設定することが可能です。
- border : 枠線
- fill : 塗りつぶし
- pattern : 塗りつぶし(パターン)
- gradient : 塗りつぶし(グラディエーション)
- layout: プロットエリアの位置とサイズを設定
先程のコードでは、layoutプロパティを使って、プロットの位置とサイズは下記のように設定しています。xとy、widthとheightの決め方はこちらを参照してください
chart.set_plotarea({'layout': {'x': 0.25, 'y': 0.1, 'width':0.75, 'height': 0.75})
軸の書式設定
chart.set_x_axis()、chart.set_y_axis()でX軸、Y軸の書式設定を行います。
Excelでは下記画面で設定することに相当します。
chart_set_x_axis()、chart_set_y_axis()にはdictを渡します。設定したいプロパティをdictのキーに設定し、各キーに対応する値は、数値や文字列やdict等を設定します。
chart.set_y_axis({
'name' : "Y",
'num_font': {'name': 'Arial', 'size': 14},
'min': -200, 'max': 200,
'crossing' : -100,
'major_gridlines': {'visible': False},
'major_tick_mark' : 'inside',
'line': {'color': 'black', 'width': 1.5}
})
設定可能なプロパティは非常に多くあります。XlsxWriterのドキュメントを見ながら色々試してみて下さい。
name #軸ラベル名 name_font #軸ラベルのフォント name_layout #軸ラベルの位置(x, y) num_font #ラベルのフォント num_format #ラベルの表示形式 line #軸の線の太さや色等 fill #塗りつぶし(単色) pattern #塗りつぶし(パターン) gradient #塗りつぶし(グラディエーション) min #最大値 max #最小値 minor_unit #補助目盛間隔 major_unit #主目盛間隔 interval_unit interval_tick crossing #縦軸との交点、または、横軸との交点 position_axis reverse #軸の反転 log_base # 対数目盛表示 label_position #ラベルの位置 label_align major_gridlines #メモリ線 minor_gridlines #補助目盛線 visible #目盛ラベルの有無 date_axis text_axis minor_unit_type major_unit_type minor_tick_mark #目盛の種類 major_tick_mark #補助目盛の種類 display_units display_units_visible