Plotly 中的对数热图

问题描述 投票:0回答:2

我正在使用 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
值,而不是对数。

python plotly heatmap plotly-python logarithm
2个回答
4
投票

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)

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


0
投票

我厌倦了每次手动执行此操作,因此我编写了一个简单的函数来自动执行此操作,可以在here找到该函数。它与

plotly.express.imshow
完全兼容,它在悬停框中以及色标中显示真实值(即不是对数),并且它实际上是对数。下面是一个工作示例。

import plotly_utils # https://github.com/SengerM/plotly_utils
import numpy

z1 = numpy.random.randint(1,100000,(33,33))
z2 = numpy.random.randint(1,500,(33,33))

for title,img in {'spanning many orders of magnitude':z1,'spanning few orders of magnitude':z2}.items():
    fig = plotly_utils.imshow_logscale(img, title=title)
    fig.show()

© www.soinside.com 2019 - 2024. All rights reserved.