为什么我的 annotation_text in python plotly.figure_factory 在某些单元格中得到错误的坐标?

Why is my annotation_text in python plotly.figure_factory getting the wrong coordinates in some cells?

我遇到了一些我不理解的行为。

代码:

import numpy as np
import plotly.figure_factory as ff

z=np.array([[30.0, 15.0, 14.72899729, 7.72994652, 19.61096606, 15.49867374, 19.85271318, 30.0],
         [30.0, 15.0, 22.36842105, 4.80104712, 20.99742268, 21.51211073, 23.5408971, 0.0],
         [30.0, 15.0, 7.5, 0.0, 0.0, 0.0, 10.63095238, 30.0]])
y = ['Ref:14973', 'Ref:17746', 'Ref:21846']
x = ['MN908947.3', '2361', '2371', '2373', '2374', '2375', '2376', 'Warnings']
z_text = np.array([['G','A', 'A', 'N', 'A', 'A', 'A', ','],
                 ['C', 'C', 'T', 'N', 'T', 'T', 'C', ',hp'],
                 ['C', 'N', 'N', 'N', 'N', 'N', 'T', ',']])
fig = ff.create_annotated_heatmap(
    z, x=x,y=y,
    annotation_text=z_text,
    colorscale=px.colors.diverging.RdYlGn,
    font_colors=['black'],
    showscale=True,
    customdata= dft44,
    hovertemplate= "Sample: %{x} <br>Position: %{y} <br>Score: %{z} <br>BAM: %{customdata}")
fig.update_yaxes(
        title_text = "Pos",
        title_standoff = 25)
fig.show()

如果放大很多,您会发现它几乎可以正常工作,来自 z_text 的文本位于第一列和最后一列(MN908947.3 和警告)的正确位置,但不在中间列(2361 到 2376)

如果您重置轴,您可以看到缺少的 z_text 标签集中在最右边:

我这辈子都想不通为什么。

非常感谢任何帮助!!

这绝对是 plotly.figure_factory 的一个错误,其中图表渲染器可能在 x = ['MN908947.3', '2361', '2371', '2373', '2374', '2375', '2376', 'Warnings'] 上遇到一些问题,因为一旦 x 数组从 'MN908947.3' to '2361' 意思改变,注释就会停止正确放置字符串和数字之间有些混淆。

我最初的解决方法是在数字前放置一些非数字符号,例如等号 ('='),以便将它们解释为字符串,但更好的解决方法是传递参数x=[1,2,3,4,5,6,7]ff.create_annotated_heatmap,然后更新 xaxes,以便这些 xticks 处的 ticktext 是您实际想要显示的 xvalues。

import numpy as np
import plotly.express as px
import plotly.figure_factory as ff

z=np.array([[30.0, 15.0, 14.72899729, 7.72994652, 19.61096606, 15.49867374, 19.85271318, 30.0],
         [30.0, 15.0, 22.36842105, 4.80104712, 20.99742268, 21.51211073, 23.5408971, 0.0],
         [30.0, 15.0, 7.5, 0.0, 0.0, 0.0, 10.63095238, 30.0]])
y = ['Ref:14973', 'Ref:17746', 'Ref:21846']

x = ['MN908947.3', '2361', '2371', '2373', '2374', '2375', '2376', 'Warnings']
z_text = np.array([['G','A', 'A', 'N', 'A', 'A', 'A', ','],
                 ['C', 'C', 'T', 'N', 'T', 'T', 'C', ',hp'],
                 ['C', 'N', 'N', 'N', 'N', 'N', 'T', ',']])
fig = ff.create_annotated_heatmap(
    z, x=list(range(len(x))),y=y,
    annotation_text=z_text,
    colorscale=px.colors.diverging.RdYlGn,
    font_colors=['black'],
    # showscale=True,
    # customdata= dft44,
    hovertemplate= "Sample: %{x} <br>Position: %{y} <br>Score: %{z} <br>BAM: %{customdata}")
fig.update_yaxes(
    title_text = "Pos",
    title_standoff = 25,
)
fig.update_xaxes(tickvals=list(range(len(x))), ticktext=x)
fig.show()