无法使用 Panel DateRangeSlider 小部件显示 Plotly 图表

Cannot display Plotly chart with Panel DateRangeSlider widget

我目前正在努力处理图表,我正在使用 DateRangeSlider 根据日期间隔更新我的图表。

数据框类似于附件table 'new_item',其中y轴是计数,x轴是设备,颜色编码对应于支付方式。我已使用 datetime.strptime() 转换日期以获得 '%Y-%m-%d' 格式,从而能够组合具有相同属性(设备和付款方式)的行并在计数列上进行汇总。 日期滑块具有日期时间格式,Purchase_Date 列是对象类型。

我正在使用 Plotly,因为我希望在将鼠标悬停在条形图上时获得交互式条形图。图表应该是这种Bar chart。我使用了下面的代码,它没有产生任何输出或错误消息。

知道为什么没有返回数字吗?是日期格式的问题吗?

date = pn.widgets.DateRangeSlider(name="Date Range",
    start=new_item.PURCHASE_DATE.min(), end=dt.date.today(),
    value=(new_item.PURCHASE_DATE.min(), dt.date.today())
)


import panel as pn
pn.extension("plotly")

@pn.depends(date)
def new_item_purchased(date):
    item_date= new_item[new_item.PURCHASE_DATE == date]
    fig = px.bar(item_date, x = 'Equipment', y = 'Count', color= 'Payment_method', log_y=True, 
                 color_discrete_sequence=px.colors.qualitative.Dark24)
    
    plt.close(fig)
    return fig

pn.Column(pn.Column(date),new_item_purchased)

由于您只对日期感兴趣,对时间不感兴趣,我会将 "Purchase_Date" 转换为 dt.date

如果您使用 pn.widgets.DateRangeSlider,那么 date 就是两个日期的列表!在下文中,我将切换到 pn.widgets.DateSlider,其中 date 是一个 date 对象。

您还使用了plt.close(fig)。请不要将 matplolib (plt.close) 与 Plotly 混合使用。它们是两个截然不同的库:它们不是为协同工作而设计的。

请注意,使用 pn.config.throttled = True 我正在激活节流:该功能将仅在滑块上的 mouse-up 事件上执行!这使得处理更大的数据帧变得容易。

from io import StringIO
import pandas as pd
import datetime as dt
import plotly.express as px
import panel as pn
pn.extension("plotly")
pn.config.throttled = True

new_item = pd.read_csv(StringIO(" Equipment Payment_method Purchase_Date Count\n0 Mower Cash 2022-03-12 8\n1 Rake Checks 2022-01-23 12\n2 Mower Credit_Card 2022-04-05 1\n3 Flower_seeds Cash 2022-02-02 3"), sep=" ", index_col=0)

new_item["Purchase_Date"] = new_item["Purchase_Date"].apply(lambda t: dt.date.fromisoformat(t))

date_slider = pn.widgets.DateSlider(
    name='Date Slider',
    start=new_item.Purchase_Date.min(), end=new_item.Purchase_Date.max(),
    value=new_item.Purchase_Date.max()
)

@pn.depends(date_slider)
def new_item_purchased(date):
    results = new_item[new_item["Purchase_Date"] == date]
    return px.bar(results, x = 'Equipment', y = 'Count', color= 'Payment_method', log_y=True, 
                 color_discrete_sequence=px.colors.qualitative.Dark24)

pn.Column(pn.Column(date_slider), new_item_purchased)