我正在使用 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
值,而不是对数。
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)
第一个给你(第二个选项非常相似......):
我厌倦了每次手动执行此操作,因此我编写了一个简单的函数来自动执行此操作,可以在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()