Plotly 中的对数热图

Posted

技术标签:

【中文标题】Plotly 中的对数热图【英文标题】:Logarithmic heatmap in Plotly 【发布时间】:2021-09-22 21:10:07 【问题描述】:

我正在使用heatmap from Plotly。我想对颜色使用对数刻度,但找不到如何操作。这是一个 MWE:

import plotly.graph_objects as go
import numpy as np

z = [[1e-4,1e-3,1e-2],
    [1e-1, 1, 1e1],
    [1e2, 1e3, 1e4]]

go.Figure(
    data = go.Heatmap(
        z = z,
    )
).show()

go.Figure(
    data = go.Heatmap(
        z = np.log(z),
    )
).show()

在 MWE 中,我手动计算数据的对数。我希望像第二张图那样显示颜色图,但不必手动转换数据,并且还可以在色标中显示真实的 z 值,而不是对数。

【问题讨论】:

提供的答案是您想要的吗? 还没来得及详细看。它看起来很接近我想要的,但颜色条仍然是线性的。 如果您觉得我的回答有用,如果您接受我将不胜感激! 我最终只是绘制了数据的对数,因为使用您的方法,图例仍然是线性的,并且当跨越多个数量级时变得难以阅读。无论如何,我可以给你投赞成票。 【参考方案1】:

在 plotly homepage 上有一个示例,我将其改编为使用 viridis 色标。它并不完美...您可以根据需要使用colorscale 分母来调整它。

import plotly.graph_objects as go
import plotly.express as px
import numpy as np

viridis = px.colors.sequential.Viridis

z = [[1e-4,1e-3,1e-2],
    [1e-1, 1, 1e1],
    [1e2, 1e3, 1e4]]

fig1 = go.Figure(
    data = go.Heatmap(
        z = z,
    colorscale = [
        [0, viridis[0]],
        [1./1000000, viridis[2]],
        [1./10000, viridis[4]],
        [1./100, viridis[7]],
        [1., viridis[9]],
    ],
    colorbar= dict(
        tick0= 0,
        tickmode= 'array',
        tickvals= [0, 1000, 10000]
    )
    )
)

另一种选择是使用:

colorscale = [
        [0, viridis[0]],
        [1./1000000, viridis[2]],
        [1./10000, viridis[4]],
        [1./100, viridis[7]],
        [1., viridis[9]],
]
px.imshow(z, color_continuous_scale=colorscale, height=600, width=600)

第一个给你(第二个选项很相似......):

【讨论】:

以上是关于Plotly 中的对数热图的主要内容,如果未能解决你的问题,请参考以下文章

Plotly:如何更改动画热图中的过渡时间?

Plotly Python 热图颜色条方向

Python & Plotly:将悬停数据添加到密度热图

为啥用 Plotly 显示热图时会出现这个问题?

Plotly:热图颜色图例我的子图

如何使用 Unstack 数据可视化 Plotly 热图