我可以在Python的Plotly Heatmap中指定单元格的宽度和高度吗?

时间:2019-08-10 20:01:00

标签: heatmap plotly-python

问题陈述

我正在尝试使用plotly.graph_objects.Heatmap来显示(x,y,z)值的数据集,其中x和y不在固定的矩形网格上。 x值在单个网格上等距分布,并且在每个x值处都有一个等距的y网格。 y个网格从一个x值到下一个x值是任意不同的(开始,停止,编号,所有值可能都不同)。所需的行为是一组以每个数据点为中心的连续矩形,其宽度由图上的x间距和每列内y间距确定。

这是matplotlib的{​​{1}}的样子:

Desired output

imshow的行为使得使用每个单元格的中心来指定这种类型的绘图变得容易,但是我缺少如何控制列的宽度。而不是我想要的宽度,所有宽度都是1。

Problem output

第二个问题是我尝试执行此操作的方式(参见下文)相当慢。

我尝试过的

要绘制上面的第二张图,我要遍历x值。对于每个值,我都会构建一个数组,该数组重复x以匹配该列的y和z数组的长度,并将其Heatmap固定在我的图中。对于我的情况,这是一种方便的构造,因为它可以确保y网格的间距适合每列。但是,由于每个跟踪中的add_trace参数只有一个重复值,因此宽度被设置为1。正如我上面所说,这也很慢。

我已经查看了https://plot.ly/python/heatmaps上的示例,并阅读了https://plot.ly/python/reference/#heatmap上的文档。

我试图理解x值的交替xx0的构造,但是关于此的文档对我来说并不明确,经过一些试验后,我继续进行。

我还尝试使用dx参数来减少单元格宽度的外观,但是由于它以像素为单位,因此破坏了绘图的缩放行为。它还不会更改悬停工具所尊重的区域,这会破坏悬停行为。

最后,我还尝试构建一个包含所有(x,y,z)值以及所需的悬浮文本的xgap。这是更快的方法,但是看起来它试图使y轴与图中所有不同的y网格相称,从而导致看起来稀疏的非常瘦的矩形阵列。

最小示例

理想情况下,我想找到一种快速自然的方法来生成以下内容,其中x边界恰好落在-0.25、0.25和0.75。

Minimal example

pandas.DataFrame

在上面的结构中是否可以方便地添加(或不那么容易)以将单元格宽度设置为0.5?如果没有,我应该使用完全不同的结构吗?

1 个答案:

答案 0 :(得分:1)

确定,您可以按照以下说明使用现有的x0dx参数,并注意以下几点:

  1. z不再是[a,b,c],而是[[a],[b],[c]],因为x0 / dx仅适用于z作为二维数组。
  2. 每个跟踪使用coloraxis="coloraxis1",以便它们共享颜色空间和颜色条。您可以在layout.coloraxis1中配置该颜色空间/颜色条。

代码:

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()

输出如下:

enter image description here