从使用 glob 导入的多个文件中绘图

Posted

技术标签:

【中文标题】从使用 glob 导入的多个文件中绘图【英文标题】:Plot from multiple files imported with glob 【发布时间】:2021-11-17 20:04:51 【问题描述】:

我需要处理数百个数据文件,我想将结果绘制在一个图表中。我正在使用带有 for 循环的 glob 来读取和存储数据,但我不知道如何用 plotly 绘制它们。

    import pandas as pd
    import plotly.express as px
    import plotly.graph_objects as go
    import plotly.io as pio
    import glob

    pio.renderers.default = 'browser'

    files = glob.glob('GIRS12_L_8V_0.95bar.*')

    traces = []

    for file in files:
        dat = pd.read_csv(file, sep='  ')
        dat.columns = ['time','v(t)'] 

        fig = go.Figure()
        traces.append(go.Scatter(x = dat['time'], y = dat['v(t)']))

    px.scatter(data_frame = traces)

调用px.scatter(...)对吗?我最后使用了 fig.show() 但我不知道为什么它没有在图表中显示任何内容。

【问题讨论】:

您的所有 CSV 文件都有两列吗? (timev(t)) 您是否希望每个文件分散为单独的颜色并在图例中有条目? (您注意到 100 多个文件,颜色将被重复使用,图例将变得太长而无法理解)。 Plotly Express 是比 图形对象 更高级别的 API,通常使用其中一种或另一种,如果 API 提供满足可视化要求所需的所有功能,则为 px 您希望每个文件中的数据在这个散点图上显示为单独的轨迹吗?或者您想使用来自所有这些文件的组合数据将v(t)time 绘制为一条轨迹? @DerekO :是的,我把它称为散点图是错误的,我想绘制 v(t) 对时间的曲线图。 @RobRaymond:是的,所有文件都有两列,此时我不介意图例,因为我只想检查数据是否可靠。 @Michele - 所以我在下面提供的解决方案有效。如果你想要线条而不是散点图,只需更改为px.line 【参考方案1】: 已生成 100 个 CSV 用于演示 pathlib 是与文件系统交互的更 Pythonic / OO 方法,因此 glob() plotly 的最简单方法是使用 Plotly Express 生成所有轨迹。已采取将所有数据准备到单个 pandas 数据框的方法,以使这变得超级简单 每 cmets,一个有这么多痕迹的图,因此这么长的图例可能不是您想要实现的最佳可视化。考虑您需要什么来可视化和调整解决方案以实现更好的可视化
from pathlib import Path
import pandas as pd
import numpy as np
import plotly.express as px

# location where files exist
p = Path.cwd().joinpath("SO_csv")
if not p.is_dir():
    p.mkdir()
# generate 100s of files
for i in range(400):
    pd.DataFrame(
        
            "time": pd.date_range("00:00", freq="30min", periods=47),
            "v(t)": pd.Series(np.random.uniform(1, 5, 47)).sort_values(),
        
    ).to_csv(p.joinpath(f"GIRS12_L_8V_0.95bar.i"), index=False)

# read and concat all the CSVs into one dataframe, creating additional column that is the filename
# scatter this dataframe, a scatter / color per CSV
px.scatter(
    pd.concat(
        [pd.read_csv(f).assign(name=f.name) for f in p.glob("GIRS12_L_8V_0.95bar.*")]
    ),
    x="time",
    y="v(t)",
    color="name",
)

【讨论】:

以上是关于从使用 glob 导入的多个文件中绘图的主要内容,如果未能解决你的问题,请参考以下文章

从 sympy 导入绘图失败

处理绘图/绘画/保存多个位图

使用多个 .csv 文件在 python 中自动制作多个绘图

R: 导入 csv 文件,导出到csv文件,;绘图后导出为图片pdf等

将数据导入反应应用程序以进行绘图

如何在 python 中读取多个 wav 文件,并转换为 numpy 数组进行绘图