JuliaでPyPlot使う
Juliaで図とかを描くとき、どうもPlotsの方が優勢なのかな。 ただ、俺は最初にPyPlotを使ってしまい、そこからPlotsに乗り換えるコストがちょっと。。。とはいえ、別にPyPlotも完全に理解していたわけではないのだけれど、今回かなり理解が進んだのでサンプルコード的に残しておこうと。 Pythonで使うなら以下の記事のほうがくわしいけど、
JuliaでPyPlot使う場合は結局細かいところをJulia文法に即して変えないといけないので、そういうのが余計検索を面倒くさくさせている気がするんですが。まあとにかく。
なお、PyPlotについては、Pythonでよく使われるmatplotlibをJuliaでも使えるようにしたのがPyPlotで、実態は中でPythonですべて動かしているという理解でしかないです。なので、Juliaでオブジェクト指向的な書き方するのもどうなのかとは思うんだけど、まあ知らん、俺は描ければいい。
ということで、独立した1つの図、左右でY軸の値やスケールが違う場合、そして複数の図を描く場合の3パターンのある程度の細かいセッティング(軸のフォントや名前、凡例の入れ方等)を含んだサンプルコードを上げておく。
1つのFigure作成
一つの図に複数の線を入れる場合で、(PPython的オブジェクト指向的な面から)推奨されている方法
# 準備 width = 7.0 hight = 5.0 titlefsize = 15.0 axisfsize = 12.0 labelfsize = 12.0 linewidth1 = 3.0 x=0.01:0.01:10.0 function u(σ::Float64,c::Float64) if σ == 1.0 util = log(c) else util = c^(1.0-σ)/(1.0-σ) end return util end # !!! ここから図関連 # CRRA効用関数でsigma = 1.0 or 1.1を # 大枠を作る。だいたいこれで図のウィンドウ作成、表示される。 fig = figure("TITLE",figsize=(width,hight)) #このTitleはウィンドウの名前になる、文字列はJuliaでは" " # その周りの軸とか諸々を追加(1 by 1の1つ目の意味) ax = fig.add_subplot(1,1,1) # 最初の線(x=0.01:0.01:10.0,y1=log(x) (sigma=1.0)) ax.plot(x,u.(1.0,x),linewidth=linewidth1,label=L"\sigma=1.0") # L""で文字列がlatex処理される # 2つめの線(x=0.01:0.01:1.0,y=u(x) with sigma = 1.1) ax.plot(x,u.(1.1,x),linewidth=linewidth1,label=L"\sigma=1.1") # 軸の調整、あんまり意味ないのかな。。。 axis("tight") # 図の上部に表示されるタイトル PyPlot.title("Utility Function",fontsize=titlefsize) # x軸の左右を規定 xlim([x[1],x[end]]) # y軸の文字の体裁 setp(ax.get_yticklabels(),fontsize=axisfsize) ax.set_ylabel("util",fontsize=labelfsize) # x軸の文字の体裁 setp(ax.get_xticklabels(),fontsize=axisfsize) ax.set_xlabel("cons",fontsize=labelfsize) #凡例 ax.legend(loc="best",fancybox="true",fontsize=axisfsize,,title="CRRA") #保存 savefig("utilityfunction.png")# eps、pdfも可
これが結果
左右のY軸の目盛りを変える
fig = figure("TITLE",figsize=(width,hight)) ax1 = fig.add_subplot(1,1,1) # 最初の線(x=0.01:0.01:10.0,y1=log(x) (sigma=1.0)) ax1.plot(x,u.(1.0,x),linewidth=linewidth1,label=L"\sigma=1.0",color="blue") # L""で文字列がlatex処理される # 2つめの線(x=0.01:0.01:1.0,y=u(x) with sigma = 1.1) ax2 = ax1.twinx() # これで右にもY軸作成 ax2.plot(x,u.(1.1,x),linewidth=linewidth1,label=L"\sigma=1.1",color="red") axis("tight") PyPlot.title("Utility Function",fontsize=titlefsize) xlim([x[1],x[end]]) setp(ax1.get_yticklabels(),fontsize=axisfsize) ax1.set_ylabel("util",fontsize=labelfsize,color="blue") ax2.set_ylabel("util",fontsize=labelfsize,color="red") setp(ax1.get_xticklabels(),fontsize=axisfsize) ax1.set_xlabel("cons",fontsize=labelfsize) #凡例を1つにまとめる handler1, label1 = ax1.get_legend_handles_labels() handler2, label2 = ax2.get_legend_handles_labels() ax1.legend(append!(handler1,handler2),append!(label1,label2), loc="best",title="CRRA") savefig("utilityfunction_2.png")
サブプロット
fig = plt.figure("TITLE",figsize=(7,5)) ax1 = fig.add_subplot(2,1,1) # 2 by1 の1つ目 ax1.set(title=L"\sigma=1.0 or 1.1") ax1.plot(x,u.(1.0,x),linewidth=linewidth1,label=L"\sigma=1.0") ax1.plot(x,u.(1.1,x),linewidth=linewidth1,label=L"\sigma=1.1") setp(ax1.get_xticklabels(),fontsize=axisfsize,visible=false) #visible = false で1つ目のx軸消す setp(ax1.get_yticklabels(),fontsize=axisfsize) ax1.set_ylabel("util",fontsize=labelfsize) ax1.legend(loc="best",fancybox="true",fontsize=axisfsize) ax1.axis("tight") ax1.set_xlim([x[1],x[end]]) ax2 = fig.add_subplot(2,1,2) # 2 by1 の2つ目 ax2.set(title=L"\sigma=1.2") ax2.plot(x,u.(1.2,x),linewidth=linewidth1,label=L"\sigma=1.2",color="green") setp(ax2.get_xticklabels(),fontsize=axisfsize) ax2.set_xlabel("cons",fontsize=labelfsize) setp(ax2.get_yticklabels(),fontsize=axisfsize) ax2.set_ylabel("util",fontsize=labelfsize) ax2.legend(loc="best",fancybox="true",fontsize=axisfsize) ax2.axis("tight") ax2.set_xlim([x[1],x[end]]) # 何らかの理由で凡例をひとまとめにしたいとき用 handler1, label1 = ax1.get_legend_handles_labels() handler2, label2 = ax2.get_legend_handles_labels() ax2.legend(append!(handler1,handler2),append!(label1,label2), loc="best") savefig("utilityfunction_3.png")
飽きたのでこんくらいで。