如何使用 plotly express 创建线图,其中可以通过下拉菜单选择 pandas 数据框?

Posted

技术标签:

【中文标题】如何使用 plotly express 创建线图,其中可以通过下拉菜单选择 pandas 数据框?【英文标题】:How can I create a line plot with plotly_express, where a pandas dataframe can be selected over a drop down menu? 【发布时间】:2021-08-19 14:31:59 【问题描述】:

我想创建一个线图,可以在其中通过下拉菜单选择基础数据。数据在 pandas 数据框中,我正在使用 plotly_express。

我尝试使用此post 作为基础,但它不使用 plotly_express 并且数据不在 pandas 数据框中。

我有这段代码,我在其中定义了data1data2,然后将它们放入按钮中。我正在将这些数据帧转换为字典,因为如果不是,我将遇到数据帧不是“json-able”的错误。

# making two new dataframes out of the all-data dataframe (for drop down select)
dfe_deworming=dfe.loc['Deworming needed'].reset_index()
dfe_anemia=dfe.loc['Anemia'].reset_index()

# making the parameters for each button

#button 1
data1=dict(dfe_deworming)
x1=dfe_deworming.Month
y1=dfe_deworming.Count
color1=dfe_deworming.Facility

#button2
data2=dict(dfe_anemia)
x2=dfe_anemia.Month
y2=dfe_anemia.Count
color2=dfe_anemia.Facility

#initial plot
fig_deworming = px.line(data_frame=data1,x=x1,y=y1,color=color1)

# update menus
updatemenus = [
    
        'buttons': [
            
                'method': 'restyle',
                'label': 'Deworming needed',
                'args': [
                    'data_frame':[data1],'x': [x1],'y':[y1],'color':[color1],
                ]
            ,
            
                'method': 'restyle',
                'label': 'Anemia',
                'args': [
                    'data_frame':[data2],'x': [x2],'y':[y2],'color':[color2],
                ]
            
        ],
        'direction': 'down',
        'showactive': True,
    
]


fig_deworming.update_layout(
    updatemenus=updatemenus
)

fig_deworming.update_traces(mode='markers+lines')

fig_deworming.show()

在初始状态下,它看起来不错。但是,如果我尝试选择一个选项,所有行都会得到完全相同的数据集。它可能是所有不同数据集的组合。

这些图片说明了问题:

First option of the drop down menu after first selection

Second option of the drop down menu after second selection

【问题讨论】:

回答我需要dfe数据框的样本 这是一个类似问题的答案:***.com/questions/65710352/… 【参考方案1】:

从根本上说,您需要为 updatemenus

使用 graph object 参数结构 已生成与您的结构相匹配的数据框 使用 plotly express 创建图表 生成 updatemenu,这些参数是您将传递给 go.Scatter 的参数 使用了列表理解,因为每个菜单都完全相同 终于解决了 plotly expresshovertemplate 生成的跟踪问题
import numpy as np
import pandas as pd
import plotly.express as px

# generate a dataframe that matches structure in question
dfe = (
    pd.DataFrame(
        
            "Month": pd.date_range("1-jan-2020", freq="M", periods=50).month,
            "Facility": np.random.choice(["Deworming needed", "Anemia"], 50),
            "Count": np.random.randint(5, 20, 50),
        
    )
    .groupby(["Facility", "Month"], as_index=False)
    .agg("Count": "sum")
)

# the line plot with px...
fig = px.line(
    dfe.loc[dfe.Facility.eq("Deworming needed")], x="Month", y="Count", color="Facility"
)


# fundametally need to be working with graph object parameters not express parameters
updatemenus = [
    
        "buttons": [
            
                "method": "restyle",
                "label": f,
                "args": [
                    
                        "x": [dfe.loc[dfe.Facility.eq(f), "Month"]],
                        "y": [dfe.loc[dfe.Facility.eq(f), "Count"]],
                        "name": f,
                        "meta": f,
                    ,
                ],
            
            for f in ["Deworming needed", "Anemia"] # dfe["Facility"].unique()
        ],
        "direction": "down",
        "showactive": True,
    
]

fig = fig.update_layout(updatemenus=updatemenus)

# px does not set an appropriate hovertemplate....
fig.update_traces(
    hovertemplate="Facility=%meta<br>Month=%x<br>Count=%y<extra></extra>",
    meta="Deworming needed",
)

【讨论】:

以上是关于如何使用 plotly express 创建线图,其中可以通过下拉菜单选择 pandas 数据框?的主要内容,如果未能解决你的问题,请参考以下文章

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

使用 plotly.express 折线图,线条以奇怪的顺序连接?怎么修? [关闭]

为啥在我制作折线图时,plotly express 会给我一个属性错误?

Plotly Express:处理子图

Plotly express 箱线图悬停数据不起作用

如何使用 Plotly 创建垂直滚动条?