无法在 plotly 中显示多线方程注释 (Python)

Unable to display a multi-line equation annotation in plotly (Python)

我正在尝试创建一个由拟合方程和最佳参数组成的注释。我使用了一个字符串标签,该标签也用于使用 matplotlib 生成类似的输出。标签有数学 symbols/notation.

一个最小的例子:

import plotly.graph_objects as go

# make up some points
xpts = [0, 1, 2, 3, 4]
ypts = [0, 2, 4, 6, 8]

# the annotation to display
func_label = "".join(["$f(x) = mx + b$\n",
                      f"$m = 2.0$ \n",
                      f"$b = 0.0$\n",
                      f"$R^2 = 0.99$\n",
                      f"$RMSE = 0.01$",])

fig = go.Figure(
    data=[go.Scatter(x=xpts,
                     y=ypts,
                     mode='markers',
                     name="Data"
                     ),
          ],
    layout=go.Layout(title="Plot Title",
                     xaxis_title="X-axis",
                     yaxis_title="Y-axis")
)

# add the annotation
fig.add_annotation(x=0.25, y=6, text="<br>".join(func_label.split('\n')), showarrow=False)

fig.show(renderer="browser")

生成的绘图输出仅显示注释的第一行:

似乎 $ 可能导致了问题,因为当我删除它们时它会打印所有行。有没有办法在保留数学渲染的同时做到这一点?

在这种情况下 $ 表示开始和结束,因此开始和结束字符串将解决问题。也许可以在创建字符串时使用换行符来做到这一点,尽管由于时间不够我还没有验证这一点。

# the annotation to display
func_label = f"<br>".join([f"$f(x) = mx + b",
                      f"m = 2.0 ",
                      f"b = 0.0",
                      f"R^2 = 0.99",
                      f"RMSE = 0.01$",])

fig = go.Figure(
    data=[go.Scatter(x=xpts,
                     y=ypts,
                     mode='markers',
                     name="Data"
                     ),
          ],
    layout=go.Layout(title="Plot Title",
                     xaxis_title="X-axis",
                     yaxis_title="Y-axis")
)

# add the annotation
fig.add_annotation(x=0.25, y=6, text=func_label, showarrow=False)

fig.show(renderer="browser") 
#fig.show()

好的,

我似乎找到了解决办法。在 mathjax 中,换行符由 \ 表示(例如,请参见此处 )。为了将它与 Python + plotly 一起使用,我必须添加一个额外的转义字符 \(尽管我还没有完全弄明白为什么)。

所以使用

func_label = '$f(x) = mx + b \\ m = 2.0 \\ b = 0.0 \\ R^2 = 0.99 \\ RMSE = 0.01$'

我能够得到 multi-line 带有我想要的公式格式的注释。

我仍在考虑是否可以在问题中使用 splitjoin 方法,但这是一个合理的选择。