将 RGB 颜色数组转换为 px.imshow 热图
Posted
技术标签:
【中文标题】将 RGB 颜色数组转换为 px.imshow 热图【英文标题】:Converting an array of RGB colours to a px.imshow heatmap 【发布时间】:2022-01-18 14:03:16 【问题描述】:我目前有这种格式的不同 RGB 颜色值的 DF:
Protein_ID1 Protein_ID2 Protein_ID3
Module1 [R, G, B] [R, G, B] [R, G, B]
Module2 [R, G, B] [R, G, B] [R, G, B]
Module3 [R, G, B] [R, G, B] [R, G, B]
我想用 px.imshow 将其显示为吃图,单元格颜色对应 RGB 值。
当我这样做时:
fig = px.imshow(df)
fig.update_layout(
xaxis=dict(
rangeslider=dict(visible=True)
)
)
fig.write_html(results_file)
我在空白结果文件中一无所获。基于第一个示例here,我将我的 df 转换为如下数组,但仍然没有运气:
array = df.to_numpy()
fig = px.imshow(array, x = df.columns, y = df.index)
fig.update_layout(
xaxis=dict(
rangeslider=dict(visible=True)
)
)
fig.write_html(results_file)
任何人都可以阐明解决此问题的正确方法吗?
谢谢! 蒂姆
【问题讨论】:
【参考方案1】: 核心输入到px.imshow()
正确。它需要是 uint8 类型的 3D numpy 数组
因此从数据框中获取值并根据输入要求进行重组
import pandas as pd
import numpy as np
import plotly.express as px
# simulate data frame
df = pd.DataFrame(
np.random.randint(0, 255, [10, 10, 3]).tolist(),
columns=[f"Protein_IDi" for i in range(10)],
index=[f"Modulei" for i in range(10)],
)
px.imshow(np.array(df.values.tolist(), dtype=np.uint8)).show()
print(df.iloc[0:3, 0:3].to_markdown())
样本数据
Protein_ID0 | Protein_ID1 | Protein_ID2 | |
---|---|---|---|
Module0 | [232, 78, 62] | [96, 105, 104] | [138, 63, 46] |
Module1 | [143, 49, 25] | [190, 70, 138] | [77, 170, 155] |
Module2 | [16, 209, 3] | [153, 215, 47] | [216, 246, 121] |
图片
带标签
px.imshow(np.array(df.values.tolist(), dtype=np.uint8)).update_layout(
xaxis="tickformat": "array", "tickvals": list(range(10)), "ticktext": df.columns,
yaxis="tickformat": "array", "tickvals": list(range(10)), "ticktext": df.index
)
【讨论】:
嗨,Rob,这非常有效。我会接受,因为它回答了提出的问题,但我意识到这个问题并不完整。是否可以设置非数字 x/y 轴,理想情况下 x/y 值出现在悬停文本中?我尝试做的事情的早期迭代,使用数据框,自动做到了(但由于其他原因失败) 更新了如何添加标签以上是关于将 RGB 颜色数组转换为 px.imshow 热图的主要内容,如果未能解决你的问题,请参考以下文章