留学・音ゲー・研究備忘録

heine98の音ゲー・研究・留学の記録。Juliaとかlatexとか使います。

JuliaでPyPlot使う

Juliaで図とかを描くとき、どうもPlotsの方が優勢なのかな。 ただ、俺は最初にPyPlotを使ってしまい、そこからPlotsに乗り換えるコストがちょっと。。。とはいえ、別にPyPlotも完全に理解していたわけではないのだけれど、今回かなり理解が進んだのでサンプルコード的に残しておこうと。 Pythonで使うなら以下の記事のほうがくわしいけど、

qiita.com

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も可

これが結果

f:id:heine98:20200301014535p:plain
図1

左右の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")

f:id:heine98:20200301015528p:plain
図2

サブプロット

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")

f:id:heine98:20200301020718p:plain
図3

飽きたのでこんくらいで。