3

下面的示例图有两个相互排斥的问题。

  1. y 轴标签和 y 刻度标签彼此重叠。我也找不到转移的方法。我想扩大地块的大小以适应必要的间距。
  2. 我希望 y 轴标签是带有下标 theta 的 sigma。看起来 Unicode 不允许下标 theta。我希望通过使用 LaTeXStrings 来解决这个限制。但是,我无法让 LatexString 扩展到绘图上的适当形式。请注意,无论是否使用 LatexString 作为 ylabel,都会出现问题 #1,并且 LatexString 扩展也不适用于其他字符串值。

下面提供了示例图、代码和数据以进行重现。我在 Windows 上使用带有 Plotly 后端的 Juno 编辑器。

显示 y 轴问题的示例图

using Plots, DelimitedFiles, LaTeXStrings
plotly(linewidth=3,titlefont=18,legendfont=16,guidefont=18,tickfont=14,formatter=:plain)
data=readdlm("hoopstress.txt",skipstart=1)
r=data[:,2]
σθ=data[:,end-1:end]
plot(r,σθ,label=["Simplified Vessel" "Full Vessel"],xlabel="r",ylabel=L"\sigma_\theta")
    Length  Simple  Full
1   0.  53280   56859
2   9.4e-2  52158   55405
3   0.1875  51036   53951
4   0.28125 49915   52498
5   0.375   48793   51044
6   0.46875 47671   49590
7   0.5625  46550   48136
8   0.65625 45428   46682
9   0.75    44307   45228
10  0.84375 43185   43774
11  0.9375  42063   42320
12  1.0312  40942   40866
13  1.125   39883   39411
14  1.2187  39256   38780
15  1.3125  38629   38150
16  1.4062  38002   37519
17  1.5 37375   36888
18  1.5938  36748   36257
19  1.6875  36121   35627
20  1.7813  35494   34996
21  1.875   34867   34365
22  1.9688  34239   33735
23  2.0625  33612   33104
24  2.1562  32985   32473
25  2.25    32389   31842
26  2.3437  31998   31441
27  2.4375  31607   31039
28  2.5312  31216   30637
29  2.625   30825   30235
30  2.7187  30434   29833
31  2.8125  30043   29431
32  2.9062  29652   29029
33  3.  29261   28628
34  3.0938  28870   28226
35  3.1875  28479   27824
36  3.2813  28088   27422
37  3.375   27714   27020
38  3.4688  27452   26693
39  3.5625  27190   26367
40  3.6563  26927   26040
41  3.75    26665   25714
42  3.8438  26403   25387
43  3.9375  26141   25061
44  4.0313  25879   24734
45  4.125   25617   24408
46  4.2187  25354   24081
47  4.3125  25092   23755
48  4.4062  24830   23428
49  4.5 24568   23102
4

4 回答 4

2

Latex 输出目前似乎在 Plotly 中被破坏。我读到,对于某些人来说,这取决于浏览器。我无法让它在 Edge 和 Chrome 上运行。

关于重叠,不幸的是,它是 plotly 本身的标准设置。但是,plotly 和 Julia 包Plotly都提供了yaxis.automargin = true覆盖此设置的参数。如果你想要额外的空间,你可以通过在标题中添加一个非空行来实现这一点,这是通过添加 html 代码来完成的。<br>&nbsp; 下面我提供了一个示例代码来实现这一点Plotly。(目前,plotly()后端Plots不支持传递特定于后端的参数。但我们正在努力实现这一点。)

using Plotly

trace1 = Plotly.scatter(Dict(
  "x" => [1, 2, 3, 4],
  "y" => [1, 4, 9, 16] .* 1000000,
  "name" => L"\alpha_{1c} = 352 \pm 11 \text{ km s}^{-1}",
  "type" => "scatter")
)

trace2 = Plotly.scatter(Dict(
  "x" => [1, 2, 3, 4],
  "y" => [0.5, 2, 4.5, 8] .* 1000000,
  "name" => L"\beta_{1c} = 25 \pm 11 \text{ km s}^{-1}",
  "type" => "scatter")
)

data = [trace1, trace2]

# standard layout (shortens numbers by SI prefix)
layout1 = Layout(xaxis = attr(title = L"\sqrt{(n_\text{c}(t|{T_\text{early}}))}"),
                 yaxis = attr(title = L"$d, r \text{ (solar radius)}")
)

# sets the number format to "0", i.e. without prefixing
layout2 = Layout(xaxis = attr(title = L"\sqrt{(n_\text{c}(t|{T_\text{early}}))}"),
                 yaxis = attr(title = L"$d, r \text{ (solar radius)}",
                             tickformat = "0")
)

# forces automargin
layout3 = Layout(xaxis = attr(title = L"\sqrt{(n_\text{c}(t|{T_\text{early}}))}"),
                 yaxis = attr(title = L"$d, r \text{ (solar radius)}",
                             tickformat = "0",
                             automargin = true)
)

# adds an additional space by adding a line to the title
# note that Plotly seems to accept html code ...
layout4 = Layout(xaxis = attr(title = L"\sqrt{(n_\text{c}(t|{T_\text{early}}))}"),
                 yaxis = attr(title = L"$d, r \text{ (solar radius)}<br>&nbsp;",
                              tickformat = "0",
                              automargin = true)
)

p1 = Plotly.plot(data, layout1)
p2 = Plotly.plot(data, layout2)
p3 = Plotly.plot(data, layout3)
p4 = Plotly.plot(data, layout4)

布局 1 布局 2 布局 3 布局 4

于 2020-05-13T16:50:51.197 回答
2

我提交了一个PR来解决这个问题,它刚刚被合并到 master :-)

所以在未来你将能够做到

plotly(linewidth=3,titlefont=18,legendfont=16,guidefont=18,tickfont=14,formatter=:plain)
r = 1:10
σθ = [100000 ./ (1:10) .+ 10000, 100000 ./ (1:10) .- 1000 .+ 10000]
plot(r , σθ, label=["Simplified Vessel" "Full Vessel"],
    xlabel = "r",
    ylabel = L"\sigma_\theta\\\color{white}.",
    yformatter = :plain,
    include_mathjax = "cdn",
    extra_kwargs = :plot)

如果您连接到互联网。

对于本地使用,如果安装了 Conda 和 IJulia,并且按照我之前的回答中所述复制了 TeX 字体,则可以执行以下操作。

import Conda.ROOTENV
function local_mathjax()
    joinpath(ROOTENV, "Lib", "site-packages", "notebook", "static", "components", "MathJax",
            "MathJax.js?config=TeX-AMS-MML_HTMLorMML-full")
end

plotly(linewidth=3,titlefont=18,legendfont=16,guidefont=18,tickfont=14,formatter=:plain)
r = 1:10
σθ = [100000 ./ (1:10) .+ 10000, 100000 ./ (1:10) .- 1000 .+ 10000]
plot(r , σθ, label=["Simplified Vessel" "Full Vessel"],
    xlabel = "r",
    ylabel = L"\sigma_\theta\\\color{white}.",
    yformatter = :plain,
    include_mathjax = local_mathjax(),
    extra_kwargs = :plot)

y 轴数字的格式现在通过yformatter = :plainy 标题中的空格通过添加一条带有白色格式点的线来实现。

当然,您也可以在系统的某个位置放置一个 mathjax 副本并将链接放在includ_mathjax参数中。

更多关于使用的细节可以在 PR 中找到。快乐编码!

于 2020-05-21T12:32:51.237 回答
1

PyPlot 输出

切换到PyPlot后端立即解决了这两个问题。

切换到GR后端修复了 LaTeX 问题,但使标签重叠变得更糟。

通过添加到脚本的顶部并添加到or语句,我在Plotly后端取得了一些成功。然而,结果并不是很令人满意。边距添加不会影响后端的标签间距。using Plots.PlotMeasuresleft_margin=80pxplotplotlyGR

我仍然想找到一种直接修改绘图标签定位的解决方案,因为绘图具有更好的交互性。

于 2020-05-13T16:25:37.040 回答
1

目前 plotly 不提供 mathjax 环境,但 Jupyter 提供。但是,默认情况下,Jupyter 不安装 TeX 字体,现在似乎是 Mathjax 的默认字体。

为了解决这个问题,您必须将原始的 mathjax 分发复制到 jupyter 保存其静态文件的目录。

  • 下载MathJax-2.7.7.zip
  • jax将-folder 从 MathJax-2.7.7.zip复制到C:\Users\<username>\.julia\conda\3\Lib\site-packages\notebook\static\components\MathJax系统上存储文件的位置或任何位置。请注意,可能有更多的 MathJax 文件夹,例如C:\Users\<username>\.julia\conda\3\pkgs\notebook-6.0.3-py36_0\Lib\site-packages\notebook\static\components\MathJax,但只有一个是服务器的真正来源。

现在你可以使用 Plotly

using Plotly

trace1 = Plotly.scatter(Dict(
  "x" => [1, 2, 3, 4],
  "y" => [1, 4, 9, 16] .* 1000000,
  "name" => L"\alpha_{1c} = 352 \pm 11 \text{ km s}^{-1}",
  "type" => "scatter")
)

trace2 = Plotly.scatter(Dict(
  "x" => [1, 2, 3, 4],
  "y" => [0.5, 2, 4.5, 8] .* 1000000,
  "name" => L"\beta_{1c} = 25 \pm 11 \text{ km s}^{-1}",
  "type" => "scatter")
)

data = [trace1, trace2]


layout = Layout(xaxis = attr(title = L"\sqrt{(n_\text{c}(t|{T_\text{early}}))}"),
                 yaxis = attr(title = L"\sigma_\theta\\?",
                              tickformat = "0",
                              automargin = true)
)

p = Plotly.plot(data, layout)

绘图中的 LaTeX

(我在 LaTeX 语法中找不到换行符的快速解决方案。仅当我添加一个字符时才保留换行符。也许,其他人可以在这里贡献 ;-))

或情节:

using Plots, LaTeXStrings

plotly()
Plots.plot(1:4, [[1,4,9,16], [0.5, 2, 4.5, 8]], 
    labels = [L"\alpha_{1c} = 352 \pm 11 \text{ km s}^{-1}" L"\beta_{1c} = 25 \pm 11 \text{ km s}^{-1}"],
    xlabel = L"\sqrt{(n_\text{c}(t|{T_\text{early}}))}",
    ylabel = L"d, r \text{ (solar radius)}"
    )

带有情节后端的 LaTeX

为了使其在 Juno 中工作,请确保Conda已安装软件包并按照上述方法复制 mathjax 字体。然后进行以下定义:

import Plots.plotly_html_head
import Conda.ROOTENV

function mathjax()
    mathjaxdir = joinpath(ROOTENV, "Lib\\site-packages\\notebook\\static\\components\\MathJax")
    mathjaxfile =  joinpath(mathjaxdir, "MathJax.js?config=TeX-AMS-MML_HTMLorMML-full")
    return """<script type="text/javascript" src="file://$mathjaxfile"></script>"""
end

function plotly_html_head(plt::Plots.Plot)
    local_file = ("file://" * Plots.plotly_local_file_path)
    plotly = Plots.use_local_dependencies[] ? Plots.local_file : Plots.plotly_remote_file_path
    if Plots.isijulia() && !Plots.ijulia_initialized[]
        # using requirejs seems to be key to load a js depency in IJulia!
        # https://requirejs.org/docs/start.html
        # https://github.com/JuliaLang/IJulia.jl/issues/345
        display("text/html", """
        <script type="text/javascript">
        requirejs([$(repr(plotly))], function(p) {
        window.Plotly = p
        });
        </script>
        """)
        ijulia_initialized[] = true
    end
    return """$(mathjax())
    <script src=$(repr(plotly))></script>"""
end
于 2020-05-14T17:10:33.147 回答