首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Plots.jl:将对数刻度刻度的刻度更改为正常格式

Plots.jl:将对数刻度刻度的刻度更改为正常格式
EN

Stack Overflow用户
提问于 2022-04-20 10:51:00
回答 2查看 158关注 0票数 2

考虑下面的情节

代码语言:javascript
复制
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表示法。

我还尝试将一个可迭代的Strings传递给xticks!,但它不对其进行调度。

我试着在文档中查看这里,但没有其他任何可能有用的东西。

朱莉娅·朗语篇这里上的交叉

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-20 12:12:13

只传递一个可迭代的字符串是行不通的,该图还需要关于将这些字符串放在x轴上的位置的信息。下列人员负责这项工作。

代码语言:javascript
复制
xticks!(p, xs, string.(xs))

将最后一个参数替换为滴答所需的任何格式。

票数 1
EN

Stack Overflow用户

发布于 2022-04-24 16:32:05

您可能需要查看ControlSystems/plotting.jl(getLogTicks)。它似乎有理由使用科学符号。下面使用滴答数来决定是使用纯指数还是使用科学:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71938377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档