我可以在 Python 的 Plotly 热图中指定单元格宽度和高度吗?
Can I specify the cell width and height in Python's Plotly Heatmap?
问题陈述
我正在尝试使用 plotly.graph_objects.Heatmap
来显示 (x, y, z) 值的数据集,其中 x 和 y 不在固定的矩形网格上。 x 值在单个网格上等距分布,并且在每个 x 值处都有一个等距分布的 y 网格。 y 网格从一个 x 值到下一个 x 值任意不同(开始、停止、数量,所有可能不同)。所需的行为是一组以每个数据点为中心的连续矩形,其宽度由图中 x 的间距和每列内 y 的间距决定。
这是 matplotlib
的 imshow
的样子:
Heatmap
的行为使得使用每个单元格的中心指定这种类型的图变得容易,但我不知道如何控制列的宽度。而不是我想要的宽度,所有的宽度都是1.
第二个问题是我尝试执行此操作的方式(见下文)相当慢。
我试过的
为了绘制上面的第二个图,我在 x 值上循环。对于每个值,我构建一个重复 x 的数组以匹配该列的 y 和 z 数组的长度,并且我 add_trace
这与我的数字相匹配。对于我的案例来说,这是一个方便的构造,因为它确保 y 网格的间距适合每一列。但是由于每个跟踪中的 x
参数有一个重复值,宽度设置为 1。正如我上面所说,这也很慢。
我看过 https://plot.ly/python/heatmaps and read the documentation at https://plot.ly/python/reference/#heatmap 中的示例。
我试图理解 x 值的替代 x0
和 dx
构造,但我不清楚这方面的文档,经过一些实验后我继续前进。
我还尝试使用 xgap
参数来减少单元格宽度的外观,但由于这是以像素为单位,因此会破坏绘图的缩放行为。它也不会更改悬停工具所关注的区域,这会破坏悬停行为。
最后,我还尝试构建一个 pandas.DataFrame
来保存所有 (x, y, z) 值以及我想要的悬停文本。这速度更快,但看起来它试图使 y 轴与图中所有不同的 y 网格相称,从而导致 sparse-looking 非常瘦的矩形数组。
最小示例
理想情况下,我想找到一种快速且 natural-looking 的方法来生成以下内容,其中 x 边界正好落在 -0.25、0.25 和 0.75。
fig = go.Figure(
layout={
"xaxis": {"range": (-0.25, 0.75),
"tickvals": [-0.25, 0.25, 0.75]
}
)
fig.add_trace(
go.Heatmap(
x=[0, 0, 0],
y=[2, 4, 6],
z=[-1, 1, 0],
name="Name A",
)
)
fig.add_trace(
go.Heatmap(
x=[0.5, 0.5, 0.5],
y=[6.1, 6.4, 6.7],
z=[-1, 1, 2],
name="Name B",
)
)
fig.show()
有什么我可以轻松(或不太容易)添加到上述构造中以将单元格宽度设置为 0.5 的东西吗?如果不是,我应该使用完全不同的结构吗?
好的,我们开始吧,您可以使用现有的 x0
和 dx
参数,如下所示,并注意以下事项:
z
不再是 [a,b,c]
而是 [[a],[b],[c]]
,因为 x0
/dx
仅适用于 z
作为二维数组。
- 每条轨迹都使用
coloraxis="coloraxis1"
,因此它们共享颜色 space 和颜色条。您可以在 layout.coloraxis1
. 中配置该颜色 space/bar
代码:
import plotly.graph_objects as go
fig = go.Figure()
fig.add_trace(
go.Heatmap(
x0=0,dx=0.5,
y=[2, 4, 6],
z=[[-1], [1], [0]],
name="Name A",
coloraxis="coloraxis1"
)
)
fig.add_trace(
go.Heatmap(
x0=0.5,dx=0.5,
y=[6.1, 6.4, 6.7],
z=[[-1], [1], [2]],
name="Name B",
coloraxis="coloraxis1"
)
)
fig.update_layout(coloraxis1=dict(
colorscale="Plasma"
))
fig.show()
输出如下:
问题陈述
我正在尝试使用 plotly.graph_objects.Heatmap
来显示 (x, y, z) 值的数据集,其中 x 和 y 不在固定的矩形网格上。 x 值在单个网格上等距分布,并且在每个 x 值处都有一个等距分布的 y 网格。 y 网格从一个 x 值到下一个 x 值任意不同(开始、停止、数量,所有可能不同)。所需的行为是一组以每个数据点为中心的连续矩形,其宽度由图中 x 的间距和每列内 y 的间距决定。
这是 matplotlib
的 imshow
的样子:
Heatmap
的行为使得使用每个单元格的中心指定这种类型的图变得容易,但我不知道如何控制列的宽度。而不是我想要的宽度,所有的宽度都是1.
第二个问题是我尝试执行此操作的方式(见下文)相当慢。
我试过的
为了绘制上面的第二个图,我在 x 值上循环。对于每个值,我构建一个重复 x 的数组以匹配该列的 y 和 z 数组的长度,并且我 add_trace
这与我的数字相匹配。对于我的案例来说,这是一个方便的构造,因为它确保 y 网格的间距适合每一列。但是由于每个跟踪中的 x
参数有一个重复值,宽度设置为 1。正如我上面所说,这也很慢。
我看过 https://plot.ly/python/heatmaps and read the documentation at https://plot.ly/python/reference/#heatmap 中的示例。
我试图理解 x 值的替代 x0
和 dx
构造,但我不清楚这方面的文档,经过一些实验后我继续前进。
我还尝试使用 xgap
参数来减少单元格宽度的外观,但由于这是以像素为单位,因此会破坏绘图的缩放行为。它也不会更改悬停工具所关注的区域,这会破坏悬停行为。
最后,我还尝试构建一个 pandas.DataFrame
来保存所有 (x, y, z) 值以及我想要的悬停文本。这速度更快,但看起来它试图使 y 轴与图中所有不同的 y 网格相称,从而导致 sparse-looking 非常瘦的矩形数组。
最小示例
理想情况下,我想找到一种快速且 natural-looking 的方法来生成以下内容,其中 x 边界正好落在 -0.25、0.25 和 0.75。
fig = go.Figure(
layout={
"xaxis": {"range": (-0.25, 0.75),
"tickvals": [-0.25, 0.25, 0.75]
}
)
fig.add_trace(
go.Heatmap(
x=[0, 0, 0],
y=[2, 4, 6],
z=[-1, 1, 0],
name="Name A",
)
)
fig.add_trace(
go.Heatmap(
x=[0.5, 0.5, 0.5],
y=[6.1, 6.4, 6.7],
z=[-1, 1, 2],
name="Name B",
)
)
fig.show()
有什么我可以轻松(或不太容易)添加到上述构造中以将单元格宽度设置为 0.5 的东西吗?如果不是,我应该使用完全不同的结构吗?
好的,我们开始吧,您可以使用现有的 x0
和 dx
参数,如下所示,并注意以下事项:
z
不再是[a,b,c]
而是[[a],[b],[c]]
,因为x0
/dx
仅适用于z
作为二维数组。- 每条轨迹都使用
coloraxis="coloraxis1"
,因此它们共享颜色 space 和颜色条。您可以在layout.coloraxis1
. 中配置该颜色 space/bar
代码:
import plotly.graph_objects as go
fig = go.Figure()
fig.add_trace(
go.Heatmap(
x0=0,dx=0.5,
y=[2, 4, 6],
z=[[-1], [1], [0]],
name="Name A",
coloraxis="coloraxis1"
)
)
fig.add_trace(
go.Heatmap(
x0=0.5,dx=0.5,
y=[6.1, 6.4, 6.7],
z=[[-1], [1], [2]],
name="Name B",
coloraxis="coloraxis1"
)
)
fig.update_layout(coloraxis1=dict(
colorscale="Plasma"
))
fig.show()
输出如下: