Pythonのmatplotlibカラープロットテンプレート

Pythonでリストデータからカラーバー付きのグラフを作成するためのテンプレートを備忘録として作成しました。ループ処理を行った場合やリスト形式のデータを与えられた場合など、リスト形式のデータを用いることは多いです。なお、数値配列(ndarray)にも使えます。

実行環境

環境、Package         Version             
-------------------------------------   
Ubuntu                 20.04.3 LTS (Focal Fossa)
matplotlib             3.4.3               
notebook               6.4.3    (jupyter-notebook)           
numpy                  1.21.2   
Copyright © 2001-2020 Python Software Foundation; All Rights Reserved

カラーバー付きグラフを作るときの悩み

単純にカラーバー付グラフを作成するだけであればネットで検索したらでてきます。しかしながら、体裁を整えるためには別のサイトを参照しなければならず不便でした。「きれいな1枚のグラフを作成したい」というシンプルな悩みを解決するテンプレート作成を行いました。特に気にしたのは以下の3点です。

  • 初めてデータ処理を行う方でもx・y座標、カラースケールを表す3つのリストデータ用意すればそのままグラフを作成可能(追加処理不要)
  • ラベルやフォントサイズなどのフォーマットのテンプレートがほしい
  • カラーバーをつけてもメインのグラフのサイズが崩れないようにしたい
カラーバーとグラフのサイズが崩れる
失敗例。figに対して2つのグラフ(ax, axcolor)を作成して、axcolorにカラーバーを追加しようとした例。
ax = fig.add_axes((0.1, 0.1, 0.9, 0.9))、
axcolor= fig.add_axes((1.1, 0.1, 0.08, 0.9))

今回作成したグラフ概要

各座標に対してatan2(y,x)関数を用いて角度ごとに色分けした。
  • x、y座標はそれぞれ±100の範囲の整数値データ(正方形状)
  • カラースケールデータ(z)は、x軸の正の方向を基準とした角度θ
  • 別の関数をグラフに重ね合わせ(今回はθ=0方向を示す点線)

今回は上記のようなグラフを作成しましたが、x,y,zに自分が使いたいデータリストを代入してそのまま流用可能だと思います。

テンプレートソースコード

以下では「x_list.csv」などのcsvファイルを読み込ませております。x_list、y_list、z_listにプロットしたい数値リストor数値配列データを代入してください。

#ライブラリインポート
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.axes_grid1 import make_axes_locatable
#リストデータ入力。
#以下のようにcsvファイルの読み込みを行うとndarray形式になる。
#数値リストを右辺に代入しても問題なく動く。
#dataが数値ではなく文字列リストの場合は、x_list=[int(s) for s in data]などとすれば数値リストに変換可能。

x_list= np.loadtxt('x_list.csv', delimiter='t')#x座標データ
y_list= np.loadtxt('y_list.csv', delimiter='t')#y座標データ
z_list= np.loadtxt('z_list.csv', delimiter='t')#カラーバーデータ
#グラフのラベルやフォントなどの形式
cm = plt.cm.get_cmap('RdYlBu')
fig = plt.figure(figsize=(6,6))
plt.rcParams['font.family'] = 'Times New Roman'#フォントがなければダウンロードの必要あり。
plt.rcParams['font.size'] = 16 # 適当に必要なサイズに
plt.rcParams['xtick.direction'] = 'in' # 目盛りをグラフ内向きに
plt.rcParams['ytick.direction'] = 'in'
plt.rcParams['axes.xmargin'] = 0.01
plt.rcParams['axes.ymargin'] = 0.01
#axを設定
ax = fig.add_axes((0.1, 0.1, 0.9, 0.9))
ax.set_title("color=atan2(y,x)")
ax.grid(which="both")#グリッド線を追加
ax.set_xlabel("xaxis_title")
ax.set_ylabel("yaxis_title")
ax.set_xlim([min(x_list),max(x_list)])
ax.set_ylim([min(y_list),max(y_list)])
#x_list,y_listの各座標における出力(z_list)をカラープロット
maingraph=ax.scatter(x_list, y_list, c=z_list, vmin=min(z_list), vmax=max(z_list), s=35, cmap=cm)#z_listの最小値と最大値をカラースケールの最大値、最小値として用いる。
#カラーバーを追加
divider = make_axes_locatable(ax) #グラフaxの外枠に仕切り(AxesDivider)を作成
color_ax = divider.append_axes("right", size="7%", pad="2%") #append_axesで新しいaxesを作成
colorbar=fig.colorbar(maingraph, cax=color_ax ) #新しく作成したaxesであるcolor_axを渡す。
#特定の方向に線を引く場合(ex. 今回は角度0方向)
xline_list = list (range(0, 101, 4))
yline_list = [0] * len(xline_list)
line=ax.scatter(xline_list, yline_list, c="black", s=2)
#グラフ描画
plt.show()
用いたcsvファイルの冒頭部分。.txt形式のファイルでも試しましたが問題なく処理されました。

本プログラムで最も重要なのは以下のライブラリです(matplotlib公式サイトより)。

from mpl_toolkits.axes_grid1.axes_divider import make_axes_locatable

今回ご紹介したテンプレートソースコードの「#カラーバーを追加」部分ではまず元のグラフ(ax)に仕切りを作成した後、その外側(“top”, “right”, “bottom”, or “left”)に新たなグラフ(color_ax)を作ります。

なお、今回フォントで「Times New Roman」を指定しておりますが、Ubuntuだと上手く反映できてないかもしれません。Qiitaのサイトを参考に試しましたが私のPCではエラーが出ます。Windowsなどのユーザーの方は問題なく使えると思います。

今回用いたcsvファイルの作成コード

import numpy as np
#x_list、y_list
width =201
height=201
data_list=[]
for i in range(width):
    for j in range (height):
        xy=[i-100,j-100]
        data_list.append(xy)
x_list = ([r[0] for r in data_list])
y_list = ([r[1] for r in data_list])
#z_list
z_list =[]
for k in range(len(data_list)):
    theta= np.arctan2(data_list[k][1], data_list[k][0]) 
    z_list.append(theta)

np.savetxt("x_list.csv", x_list, delimiter =",",fmt ='% s')
np.savetxt("y_list.csv", y_list, delimiter =",",fmt ='% s')
np.savetxt("z_list.csv", z_list, delimiter =",",fmt ='% s')

csvファイルに保存すると作成したファイルを再び読み込んだときにndarray形式になります。x_listなどの導出した時点ではリスト形式です。本記事のプログラムは数値配列でも数値リストでも同様に動きます。(リストデータはnp.ndarrayで配列データに変換可能)

まとめ

今回はカラープロットをmatplotlibで書く際のテンプレートをまとめました。まずは1つのグラフをきれいに描きたい、という方の参考になれば嬉しいです。

コメント

タイトルとURLをコピーしました