在 plotly express 中添加另一个数据框作为注释

Posted

技术标签:

【中文标题】在 plotly express 中添加另一个数据框作为注释【英文标题】:Add another dataframe as annotation in plotly express 【发布时间】:2021-09-13 06:27:52 【问题描述】:

我使用 UMAP 可视化数据,但无法添加适当的注释。如何使用相同长度的另一个数据框将悬停文本添加到绘图表达散点图? 据我了解,我只能从data_2d 那里指定一列。我可以从another_df 获取所有行作为注释吗?

import plotly.express as px
def scatter(data_2d, labels, another_df):
    c = dict(zip(labels.unique, px.colors.qualitative.G10)) # make the same colors for another data
    fig = px.scatter(
        data_2d, x=0, y=1,
        color=labels,
        color_discrete_map=c,
        text=another_df, # here I'm stuck
        # expected annotation 
      #  column1: 57575874
      #  column2: 0.4545
      #  columnN: ....

        # hover_data  awaits for labels from data_2d and it doesn't work
        # text is constant, I see just a mess of text
    )

    fig.update_traces(marker=dict(size=5, opacity=0.7))

    fig.show()

【问题讨论】:

仅从您目前的解释来看,我不太理解。我需要展示我目前正在获取的图表以及我想要添加的数据。 【参考方案1】: 您的示例代码 没有定义数据结构,来自 cmets 我已经暗示了代码中的内容 xy 作为值在语法上不正确,已修复从 UMAP 提取到 2D numpy 数组 解决方案 您已定义 another_dfdata_2d 的长度相同。一种选择是在通过转换之前使用所有列的数据框 labels 参数确实是多余的,它是 another_df 的一部分 您要定义 hover 输入,已定义 hover_namehover_data。使用了 another_df 中的所有列
import plotly.express as px
import pandas as pd
import numpy as np
import umap.umap_ as umap
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

def scatter(data_2d, labels, another_df):
    c = dict(zip(labels.unique(), px.colors.qualitative.G10)) # make the same colors for another data
    fig = px.scatter(
        another_df, 
        x=data_2d[:,0],y=data_2d[:,1],
        color=labels,
        color_discrete_map=c,
        hover_name="island",
        hover_data=another_df.columns
    )
    fig.update_traces(marker=dict(size=5, opacity=0.7))
    fig.show()

    
penguins = pd.read_csv("https://github.com/allisonhorst/palmerpenguins/raw/5b5891f01b52ae26ad8cb9755ec93672f49328a8/data/penguins_size.csv")
data = penguins.loc[:,["culmen_length_mm","culmen_depth_mm","flipper_length_mm","body_mass_g",]].dropna()
scaled_penguin_data = StandardScaler().fit_transform(data.values)

reducer = umap.UMAP()
embedding = reducer.fit_transform(scaled_penguin_data)
scatter(embedding, penguins.loc[data.index, "sex"].fillna("UNKNOWN"), penguins.loc[data.index])

【讨论】:

感谢您的支持。 data_2d 是我从 UMAP 获得的一个 numpy 数组。文本的问题是我经常看到它,但我需要一个悬停注释。对不起,我没有写。我试过了,5000分,看起来一团糟。 ok 更新了——我以前从未遇到过 UMAP,它使用起来非常简单。解决方案的关键是对如何使用 pandas 和 numpy 有很好的了解。顺便说一句,情节术语“悬停文本”,“注释”是与布局相关的不同功能而不是跟踪

以上是关于在 plotly express 中添加另一个数据框作为注释的主要内容,如果未能解决你的问题,请参考以下文章

Plotly:如何在 Plotly Express 中注释多行?

如何使用 plotly express 向折线图添加点或标记?

Plotly Express:处理子图

在不使用 Plotly Express 的情况下向 Plotly 子图添加垂直矩形

如何使用 Python 中的 Plotly Express 为每个条形图添加可点击链接?

使用 plotly 在一个图中绘制多条 3d 线