交互式可视化选择要可视化的csv

2024-03-28 21:29:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用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....

  

我想做的是创建一个insteractive可视化,允许用户选择文件名(例如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')
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,然后打印其数据,而不创建一个包含所有文件的巨型数据框

可能吗

编辑:由小黄瓜提出的解决方案非常有效,但我希望使用它的下拉菜单在里面有一个Plotly解决方案


Tags: 文件csv数据path代码importos可视化
2条回答

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

from tkinter.filedialog import askopenfilename
filename = askopenfilename()

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

由于您使用的是Jupyter笔记本,因此您有许多不同的选择

一些可视化库将具有内置的widgets供您使用,但是它们通常需要您运行服务器或提供javascript回调。对于与库无关的方法,可以使用ipywidgets。此库专门用于创建Jupyter笔记本中使用的小部件。文件是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函数将被调用并传递一个带有“new”值、“old”值和其他一些内容的字典

这里有一个函数,用于生成具有可调整数据源的基本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文件,另一件事是您可能希望实现一个缓存系统,以便将最后几个用户选择保留在内存中,并避免在每次选择时重新读取它们

为了更深入地了解如何使用ipywidgetsmatplotlib图添加交互性,我发现这个tutorial非常有用

相关问题 更多 >