#==========
Julia の修行をするときに,いろいろなプログラムを書き換えるのは有効な方法だ。
以下のプログラムを Julia に翻訳してみる。
対数軸でのプロット
http://aoki2.si.gunma-u.ac.jp/R/log-plot.html
ファイル名: logplot.jl 関数名: logplot
翻訳するときに書いたメモ
takelog で "xy", "x", "y", "" を指定することにした。
デフォルトでは,普通の x-y グラフを描くことになる。
==========#
using Plots
function logplot(x, y; takelog = "", xlab = "x", ylab = "y", main = "", color = "gray")
function logaxis(z)
pos = zeros(100)
minval = minimum(z)
maxval = maximum(z)
logmaxval = log10(maxval)
logminval = log10(minval)
width = logmaxval - logminval
factor = logmaxval < 3.5 ? 15 : 8
w = width / factor
st = floor(logminval)
delta = 10^st
ic = 0
while true
for i = 1:9
v = i * delta
if minval - delta <= v <= maxval + delta
if (i == 1 || ic == 0) || (ic > 0 && log10(v) - pos[ic] > w)
if i == 1 && ic > 0 && log10(v) - pos[ic] <= w
ic -= 1
end
ic += 1
pos[ic] = log10(v)
prev = v
end
end
end
delta *= 10
if delta > maxval
break
end
end
return ic > 3 ? pos[2:ic-1] : [logminval, median([logminval, logmaxval]), logmaxval]
end
pyplot()
logy = log10.(y)
posy = logaxis(y)
logx = log10.(x)
posx = logaxis(x)
if 'x' in takelog && 'y' in takelog
plt = scatter(logx, logy, label = "")
yticks!(posy, string.(round.(10 .^ posy, digits = 1)))
xticks!(posx, string.(round.(10 .^ posx, digits = 1)))
elseif 'y' in takelog
plt = scatter(x, logy, label = "")
yticks!(posy, string.(round.(10 .^ posy, digits = 1)))
elseif 'x' in takelog
plt = scatter(logx, y, label = "")
xticks!(posx, string.(round.(10 .^ posx, digits = 1)))
else
plt = scatter(x, y, label = "")
end
plt = plot!(xlabel = xlab, ylabel = ylab, title = main)
display(plt)
end
x = collect(1:0.5:9.5);
y = exp.(x);
logplot(x, y, main = "simple x : y graph")
logplot(x, y, takelog = "y", main = "semilog graph x : log(y)")
logplot(y, x, takelog = "x", main = "semilog graph log(x) : y")
x = 2 .^ collect(range(1, 5, length = 10));
y = 1.3 .^ collect(range(2, 10, length = 10));
logplot(x, y, takelog = "xy", main = "log-log graph log(x) : log(y)")