Plots.jl:将对数刻度刻度的格式更改为正常格式
Plots.jl: Change formating of logscale ticks to normal formatting
考虑以下情节
using Plots
pyplot()
radix_range_xticks = -4:4
radix_range = LinRange(-4, 4, 100)
xs = 2.0 .^ radix_range_xticks
pf = 50.0
bw = 25.0
roofline(x, bw, pf) = min(bw*x, pf)
ys = roofline.(xs, bw, pf)
p = plot(xs, ys; xscale=:log2, yscale=:log10)
xticks!(p, xs)
这导致了一个看起来像这样的情节。
x 刻度和 y 刻度均采用指数格式。添加关键字参数 xformatter=:scientific
没有帮助,因为它只是更改基数而不是整数。
那么,我如何格式化刻度线,例如科学计数法?我想完全摆脱 base^exponent
符号。
我也试过将 String
的可迭代传递给 xticks!
,但它没有调度它。
我试图查看 here 文档,但找不到任何其他可能有用的东西。
在 Julia lang 话语中交叉发布 here
仅传递可迭代的字符串是行不通的,绘图还需要有关将这些字符串放置在 x-axis 上何处的信息。以下是这项工作。
xticks!(p, xs, string.(xs))
将最后一个参数替换为刻度所需的任何格式。
您可能想查看 ControlSystems/plotting.jl(getLogTicks)。
它似乎有使用科学记数法的理由。以下使用刻度数来决定是使用纯指数还是科学:
function getLogTicks(x, minmax)
minx, maxx = minmax
major_minor_limit = 6
minor_text_limit = 8
min = minx <= 0 ? minimum(x) : ceil(log10(minx))
max = floor(log10(maxx))
major = exp10.(min:max)
if Plots.backend() ∉ [Plots.GRBackend(), Plots.PlotlyBackend()]
majorText = [latexstring("$10^{$(round(Int64,i))}$") for i = min:max]
else
majorText = ["10^{$(round(Int64,i))}" for i = min:max]
end
if max - min < major_minor_limit
minor = [j*exp10(i) for i = (min-1):(max+1) for j = 2:9]
if Plots.backend() ∉ [Plots.GRBackend(), Plots.PlotlyBackend()]
minorText = [latexstring("$$j\cdot10^{$(round(Int64,i))}$") for i = (min-1):(max+1) for j = 2:9]
else
minorText = ["$j*10^{$(round(Int64,i))}" for i = (min-1):(max+1) for j = 2:9]
end
ind = findall(minx .<= minor .<= maxx)
minor = minor[ind]
minorText = minorText[ind]
if length(minor) > minor_text_limit
minorText = [" " for t in minorText]#fill!(minorText, L" ")
end
perm = sortperm([major; minor])
return [major; minor][perm], [majorText; minorText][perm]
else
return major, majorText
end
end
考虑以下情节
using Plots
pyplot()
radix_range_xticks = -4:4
radix_range = LinRange(-4, 4, 100)
xs = 2.0 .^ radix_range_xticks
pf = 50.0
bw = 25.0
roofline(x, bw, pf) = min(bw*x, pf)
ys = roofline.(xs, bw, pf)
p = plot(xs, ys; xscale=:log2, yscale=:log10)
xticks!(p, xs)
这导致了一个看起来像这样的情节。
x 刻度和 y 刻度均采用指数格式。添加关键字参数 xformatter=:scientific
没有帮助,因为它只是更改基数而不是整数。
那么,我如何格式化刻度线,例如科学计数法?我想完全摆脱 base^exponent
符号。
我也试过将 String
的可迭代传递给 xticks!
,但它没有调度它。
我试图查看 here 文档,但找不到任何其他可能有用的东西。
在 Julia lang 话语中交叉发布 here
仅传递可迭代的字符串是行不通的,绘图还需要有关将这些字符串放置在 x-axis 上何处的信息。以下是这项工作。
xticks!(p, xs, string.(xs))
将最后一个参数替换为刻度所需的任何格式。
您可能想查看 ControlSystems/plotting.jl(getLogTicks)。 它似乎有使用科学记数法的理由。以下使用刻度数来决定是使用纯指数还是科学:
function getLogTicks(x, minmax)
minx, maxx = minmax
major_minor_limit = 6
minor_text_limit = 8
min = minx <= 0 ? minimum(x) : ceil(log10(minx))
max = floor(log10(maxx))
major = exp10.(min:max)
if Plots.backend() ∉ [Plots.GRBackend(), Plots.PlotlyBackend()]
majorText = [latexstring("$10^{$(round(Int64,i))}$") for i = min:max]
else
majorText = ["10^{$(round(Int64,i))}" for i = min:max]
end
if max - min < major_minor_limit
minor = [j*exp10(i) for i = (min-1):(max+1) for j = 2:9]
if Plots.backend() ∉ [Plots.GRBackend(), Plots.PlotlyBackend()]
minorText = [latexstring("$$j\cdot10^{$(round(Int64,i))}$") for i = (min-1):(max+1) for j = 2:9]
else
minorText = ["$j*10^{$(round(Int64,i))}" for i = (min-1):(max+1) for j = 2:9]
end
ind = findall(minx .<= minor .<= maxx)
minor = minor[ind]
minorText = minorText[ind]
if length(minor) > minor_text_limit
minorText = [" " for t in minorText]#fill!(minorText, L" ")
end
perm = sortperm([major; minor])
return [major; minor][perm], [majorText; minorText][perm]
else
return major, majorText
end
end