【问题标题】:Plotly's Heatmap from (x, y, z) data来自 (x, y, z) 数据的 Plotly 热图
【发布时间】:2021-03-29 23:59:08
【问题描述】:

我正在尝试实现 Plotly 的热图。您可以查看https://plotly.com/python/heatmaps/中的文档

文档中的一个例子是:

import plotly.graph_objects as go

fig = go.Figure(data=go.Heatmap(
                   z=[[1, None, 30, 50, 1], [20, 1, 60, 80, 30], [30, 60, 1, -10, 20]],
                   x=['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'],
                   y=['Morning', 'Afternoon', 'Evening'],
                   hoverongaps = False))
fig.show()

输出:

问题是,假设我在 (x, y, z) 之类的表中有数据。例如,根据上图:

data = [
['Monday', 'Morning', 1],
['Monday', 'Afternoon', 20],
['Monday', 'Evening', 30],
['Tuesday', 'Morning', None],
['Tuesday', 'Afternoon', 1],
['Tuesday', 'Evening', 60],
['Wednesday', 'Morning', 30],
['Wednesday', 'Afternoon', 60],
['Wednesday', 'Evening', 1],
['Thursday', 'Morning', 50],
['Thursday', 'Afternoon', 80],
['Thursday', 'Evening', -10],
['Friday', 'Morning', 1],
['Friday', 'Afternoon', 30],
['Friday', 'Evening', 20]
]

或在 DataFrame 中:

import pandas as pd
df = pd.DataFrame(data=data, columns=['x','y','z'])
print(df)

输出:

            x          y     z
0      Monday    Morning   1.0
1      Monday  Afternoon  20.0
2      Monday    Evening  30.0
3     Tuesday    Morning   NaN
4     Tuesday  Afternoon   1.0
5     Tuesday    Evening  60.0
6   Wednesday    Morning  30.0
7   Wednesday  Afternoon  60.0
8   Wednesday    Evening   1.0
9    Thursday    Morning  50.0
10   Thursday  Afternoon  80.0
11   Thursday    Evening -10.0
12     Friday    Morning   1.0
13     Friday  Afternoon  30.0
14     Friday    Evening  20.0

如何轻松地将这些数据转换为 Plotly 所需的格式?

【问题讨论】:

    标签: python plotly


    【解决方案1】:

    好吧,我必须承认,这不是我最干净的代码,但它完成了工作。

    首先,注意data 中的z 与情节示例z 的顺序不同。这是因为您的按天排序,而他们的按一天中的时间排序。所以首先我使用它进行排序,使用自定义字典键,使用 numpy 的 reshape 方法将其转换为所需的形状,然后将值转换为浮点数。

    对于 x 和 y,我使用了列表推导,即列表集技巧,然后将它们排序回所需的顺序。

    最后,这只是一个策划的问题。

    import plotly.graph_objects as go
    import numpy as np
    
    data = [
    ['Monday', 'Morning', 1],
    ['Monday', 'Afternoon', 20],
    ['Monday', 'Evening', 30],
    ['Tuesday', 'Morning', None],
    ['Tuesday', 'Afternoon', 1],
    ['Tuesday', 'Evening', 60],
    ['Wednesday', 'Morning', 30],
    ['Wednesday', 'Afternoon', 60],
    ['Wednesday', 'Evening', 1],
    ['Thursday', 'Morning', 50],
    ['Thursday', 'Afternoon', 80],
    ['Thursday', 'Evening', -10],
    ['Friday', 'Morning', 1],
    ['Friday', 'Afternoon', 30],
    ['Friday', 'Evening', 20]
    ]
    
    
    seq_time = {'Morning':0, 'Afternoon':1, 'Evening':2}
    seq_day = {'Monday':0, 'Tuesday': 1, 'Wednesday':2, 'Thursday':3, 'Friday':4}
    data.sort(key = lambda x: seq_time[x[1]])
    z = np.array([i[2] for i in data]).reshape(3,5).astype(float)
    x = sorted(list(set([i[0] for i in data])), key = lambda x: seq_day[x])
    y = sorted(list(set([i[1] for i in data])), key = lambda x: seq_time[x])
    
    fig = go.Figure(data=go.Heatmap(
                       z=z,
                       x=x,
                       y=y,
                       hoverongaps = False))
    fig.show()
    
    

    【讨论】:

      猜你喜欢
      • 2018-01-10
      • 2017-02-05
      • 2018-11-02
      • 1970-01-01
      • 2013-02-26
      • 1970-01-01
      • 2021-06-10
      • 2019-11-24
      • 2019-07-20
      相关资源
      最近更新 更多