【问题标题】:Creating an interactive plot with pandas and ipywidgets, using values from dataframe column as inputs使用数据框列中的值作为输入,使用 pandas 和 ipywidgets 创建交互式绘图
【发布时间】:2020-04-16 19:49:25
【问题描述】:

我有一个 Pandas 数据框,其中列出了多家公司、他们在当月收到的消费者投诉数量以及收到投诉的月份:

我正在尝试创建一个交互式图,其中“公司”下的所有值都显示在下拉菜单中,当用户选择公司字符串时,线图将自动更新以查看公司有多少投诉随着时间的推移收到。我在某种程度上构建了单独的组件:

dropdown = widgets.Dropdown(options = sorted(list(set(df['company']))))

会显示

然后我可以执行以下代码以显示带有dropdown.value 的绘图,或者使用df.plotdf.iplot

df.plot 示例:

def line_plot(df, company):

    df = df[df['company'] == company]

    df.set_index('month').plot()

line_plot(df, dropdown.value)

df.iplot 示例:

df1 = df[df['company'] == dropdown.value]
df1.iplot(kind = 'line', x = 'month', y = 'complaints')

我遇到的问题实际上是弄清楚如何使用公司名称作为我想要生成的绘图的输入。我一直在阅读 ipywidgets 和我发现的所有示例都使用数据框列本身作为下拉菜单值,而不是特定的列值。我尝试了以下方法:

@interact
def line_plot(company = sorted(df['company'].unique())):

    df = df[df['company'] == company]

    df.iplot(kind = 'line', x = company)

并获得此回溯:

---------------------------------------------------------------------------
UnboundLocalError                         Traceback (most recent call last)
/Applications/anaconda3/lib/python3.7/site-packages/ipywidgets/widgets/interaction.py in update(self, *args)
    254                     value = widget.get_interact_value()
    255                     self.kwargs[widget._kwarg] = value
--> 256                 self.result = self.f(**self.kwargs)
    257                 show_inline_matplotlib_plots()
    258                 if self.auto_display and self.result is not None:

<ipython-input-1040-3e3ff8e76afe> in line_plot(company)
      2 def line_plot(company = sorted(df['company'].unique())):
      3 
----> 4     df = df[df['company'] == company]
      5 
      6     df.iplot(kind = 'line', x = company)

UnboundLocalError: local variable 'df' referenced before assignment

还有:

interactive_plot = interactive(line_plot, df = df, company = sorted(list(set(df['company']))))
interactive_plot

然后接收

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/Applications/anaconda3/lib/python3.7/site-packages/ipywidgets/widgets/interaction.py in update(self, *args)
    254                     value = widget.get_interact_value()
    255                     self.kwargs[widget._kwarg] = value
--> 256                 self.result = self.f(**self.kwargs)
    257                 show_inline_matplotlib_plots()
    258                 if self.auto_display and self.result is not None:

<ipython-input-1026-e7a7c82e3c6b> in line_plot(df, company)
      1 def line_plot(df, company):
      2 
----> 3     df = df[df['company'] == company]
      4 
      5     df.set_index('month').plot()

TypeError: string indices must be integers

我是否朝着正确的方向前进,或者我正在尝试通过 ipywidgets 实现什么?我将继续研究这可能如何工作。

【问题讨论】:

  • 为什么要将 line_plot 函数的公司参数的默认值设置为列表:sorted(df['company'].unique())?而且我认为此时可能是 df 尚未初始化。注意默认函数参数,对于列表这样的容器总是很棘手。

标签: python pandas matplotlib ipywidgets


【解决方案1】:

我已经想出了一种方法来实现它,尽管理想情况下我希望“列”下拉菜单不可见:

【讨论】:

  • 如果您使用column = widgets.fixed(['company']),该下拉菜单将被隐藏。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-13
  • 2017-02-28
  • 2022-01-09
  • 1970-01-01
  • 2017-08-02
  • 1970-01-01
相关资源
最近更新 更多