python - 来自 (x, y, z) 数据的 Plotly 热图
问题描述
我正在尝试实现 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 所需的格式?
解决方案
好吧,我必须承认,这不是我最干净的代码,但它完成了工作。
首先,请注意z
indata
与 plotly example 的顺序不同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()
推荐阅读
- php - 在 laravel 中合并和合并数组
- python - 如何检查字符串列表中的多个单词?
- python - 如何基于一个数据框中的一列和第二个数据框中的两列合并两个数据框
- azure-devops - Azure DevOps 任务控制选项:无法更改“运行此任务”下拉菜单
- python - 如何连接到本地运行的 MSSQL?
- ssis - 虽然将数据从 Excel 导入 SQL DB SSIS 显示整数列为 NULL
- android - 根据名称显示图像 (Kotlin)
- postgresql - Postgresql 的 URL 规范化
- c++ - 创建原始套接字客户端以连接到 Web 主机
- javascript - 用于下载的 XML 文件的编码