如何使用 px.imshow 在 Plotly 中并排显示两个方形图像?

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

我有两个方形图像,存储为 numpy 数组,均为 256 x 256 x 3。我可以使用

px.imshow
在其自己的单个图像中显示每个图像,这是一个很好的方形图。但是,当我使用子图并排放置两个图时,第一个图是预期的正方形,但第二个图始终是矩形。就好像它试图填充剩余的空间,而不是简单地放置
px.imshow
的输出。

我尝试过使用

make_subplots
的输入,例如设置
shared_yaxes=True
shared_xaxes=True
等。我什至尝试强制
update_layout
中的图形大小,宽度是高度的两倍,但这也失败了。有趣的是,如果我增加宽度,它似乎变得更像正方形,但仍然不完全是。

我如何强制这两个图像显示为正方形?

我在下面放置了一些虚拟代码并显示了我当前所在的位置。

import numpy as np
import plotly.express as px
import plotly.graph_objs as go
from plotly.subplots import make_subplots

im1 = np.random.random(size=(256, 256, 3))
im2 = np.random.random(size=(256, 256, 3))

fig = make_subplots(rows=1, cols=2, shared_yaxes=True, horizontal_spacing=0.01)
fig.add_trace(px.imshow(im1).data[0], row=1, col=1)
fig.add_trace(px.imshow(im2).data[0], row=1, col=2)

fig.update_layout(width=600, height=300, autosize=False)
fig.show()

将宽度和高度分别加倍到 1200 和 600,会导致更“正确”的结果,但这似乎不是解决问题的方法。

非常感谢任何帮助!

python plotly
1个回答
0
投票

您需要显式添加

scaleanchor
约束。默认情况下,图像轨迹设置了
yaxis: {scaleanchor: "x"}
,以便将像素渲染为正方形,但此处设置
shared_yaxes=True
在第二个 y 轴上添加了
matches
约束,以防止应用其缩放锚点(一个轴不能同时具有两个约束) ),因此第一张图像得到了方形像素,但第二张图像没有得到方形像素。

解决方案是在 x 轴上设置约束:

fig.update_layout(width=600, height=300, xaxis2_scaleanchor="y2")

请注意,您可以利用 px

facet_<*>
参数在一行中构建整个图形,并且通过这样做,可以正确处理不同的约束,因此您不必在事后(重新)设置它们:

fig = px.imshow(np.array([im1, im2]), facet_col=0, aspect='equal', facet_col_spacing=0.01)
fig.update_layout(width=600, height=300)
© www.soinside.com 2019 - 2024. All rights reserved.