交互式可视化-选择要可视化的CSV

问题描述

我正在使用Python编写交互式可视化代码。 我想做的是创建一个交互式的可视化视图,允许用户从下拉菜单(或类似的菜单)中选择一个文件,然后绘制所选数据的条形图。

我的数据文件夹具有以下结构:

+-- it_features
|   +-- it_2017-01-20--2017-01-27.csv
|   +-- it_2017-01-27--2017-02-03.csv
|   +-- it_2017-02-03--2017-02-10.csv

依此类推(还有更多文件,为简单起见,我只报告其中的几个)。

到目前为止,我已经能够访问和检索文件夹中包含的所有数据:

import os
import pandas as pd
path = os.getcwd()
file_folder = os.path.join(path,'it_features')


for csv_file in os.listdir(file_folder): 
    print(csv_file)
    file = os.path.join(file_folder,csv_file)
    df = pd.read_csv(file)
    #following code....

  

我想做的是创建一个内部可视化,允许用户选择文件名(例如it_2017-02-03--2017-02-10.csv)并绘制该文件的数据。 / p>

我可以“手动”选择想要的文件,并通过将其文件名插入变量然后检索数据来绘制其数据,但我不想通过代码插入它,并允许最终用户使用下拉菜单或类似菜单浏览并选择一个文件

我的简单代码

import os
import pandas as pd
path = os.getcwd()
file_folder = os.path.join(path,'it_features')
file = os.path.join(file_folder,'it_2020-02-07--2020-02-14.csv') # Here I insert my filename
df=pd.read_csv(file)
ax=df.value_counts(subset=['Artist']).head(10).plot(y='number of songs',kind='bar',figsize=(15,7),title="7-14 February 2020")
ax.set_xlabel("Artist")
ax.set_ylabel("Number of Songs Top 200")

哪个生成以下图:

Barplot

正如我已经说过的,我想介绍一个略微下降的菜单,该菜单允许用户使用交互式绘图选择要绘制的csv数据。

我看到可以使用Plotly创建下拉菜单,但是在各种示例(https://plotly.com/python/dropdowns/)中,似乎没有选择然后加载数据。

我还看到了这段代码Kaggle code),它似乎可以完成我想做的事情:您可以选择区域并从该区域绘制数据。

主要问题是他只是创建了一个带有美国各州的大型唯一数据框,然后为它们中的每一个创建了跟踪。

我想做的(如果可能的话)是从下拉列表中选择文件名,加载csv,然后绘制其数据,而无需创建一个包含所有文件的巨型数据框。

有可能吗?

编辑 gherka 提出的解决方效果很好,但我希望使用其下拉菜单在Plotly内部提供解决方案。 / p>

解决方法

由于您在Jupyter Notebook中工作,因此有许多不同的选择。

某些可视化库将具有内置的widgets,供您使用,但是它们通常会要求您运行服务器或提供JavaScript回调。对于与库无关的方法,可以使用ipywidgets。该库专门用于创建在Jupyter Notebook中使用的小部件。该文档为here

要创建一个带有静态条形图的简单下拉菜单,您需要三个小部件-Label(用于下拉菜单描述),DropdownOutputVBox用于布置它们。

from ipywidgets import VBox,Label,Dropdown,Output

desc = Label("Pick a .csv to plot:")

dropdown = Dropdown(
    options=['None','csv1','csv2','csv3'],value='None',disabled=False)

output = Output()

dropdown.observe(generate_plot,names="value")

VBox([desc,dropdown,output])

enter image description here

关键元素是generate_plot函数。它必须具有一个参数,您可以使用该参数来确定小部件动作对绘图的影响。当您与下拉菜单进行交互时,将调用generate_plot函数,并传递一个包含“新”值,“旧”值和其他一些内容的字典。

这是一个用于生成具有可调数据源的基本seaborn条形图的功能。请注意,我必须包含一个明确的plt.show()-否则将无法渲染图。

def generate_plot(change):
    with output:
        output.clear_output() # reset the view
        if change["new"] != "None":
            data = pd.read_csv(...) # your custom code based on dropdown selection
            sns.catplot(x="Letters",y="Numbers",kind="bar",data=data)
            fig = plt.figure()
            plt.show(fig)

如果您有很多大的.csv文件,则可能要做的另一件事是实现一个缓存系统,以便将最后几个用户选择保留在内存中,并避免在每个选择中重新读取它们。

要更深入地研究如何使用matplotlibipywidgets情节添加交互性,我发现此tutorial非常有用。

,

tkinter是用于python的超级通用UI框架,并且是标准库的一部分。根据类似问题的答案,您可以使用以下方法:

from tkinter.filedialog import askopenfilename
filename = askopenfilename()

会弹出一个标准文件浏览器窗口。