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

Posted

技术标签:

【中文标题】为啥我在 python plotly.figure_factory 中的 annotation_text 在某些单元格中得到了错误的坐标?【英文标题】:Why is my annotation_text in python plotly.figure_factory getting the wrong coordinates in some cells?为什么我在 python plotly.figure_factory 中的 annotation_text 在某些单元格中得到了错误的坐标? 【发布时间】:2021-11-23 23:15:56 【问题描述】:

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

代码:

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 标签:

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

非常感谢任何帮助!

【问题讨论】:

【参考方案1】:

这绝对是 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()

【讨论】:

以上是关于为啥我在 python plotly.figure_factory 中的 annotation_text 在某些单元格中得到了错误的坐标?的主要内容,如果未能解决你的问题,请参考以下文章

Plotly:如何在甘特图上标记条形?

如何将颜色代码图例从对数刻度转换为实际值?

为啥我在 python 中看到时区异常[重复]

为啥我在 Python 中没有得到 333

为啥我在 python 中收到此错误? (httplib)

为啥我在 Python 中收到错误消息“无法导入名称 NoneType”?