Построение из нескольких файлов, импортированных с помощью glob

#pandas #plot #graph #plotly #glob

Вопрос:

Мне нужно обработать сотни файлов данных, и я хочу отобразить результаты в одном графике. Я использую glob с циклом for для чтения и хранения данных, но я понятия не имею, как построить их с помощью 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(…)? Я использовал рис.show() в конце, но я не знаю, почему он ничего не показывает на графике.

Комментарии:

1. у всех ли ваших резюме есть две колонки? ( время и v(t) ) вы хотите, чтобы каждый файл был разбросан отдельным цветом и имел запись в легенде? (вы отмечаете 100 файлов, цвета будут использоваться повторно, легенда станет слишком длинной для понимания). Plotly Express -это API более высокого уровня, чем графические объекты , обычно использующие тот или иной, px, если API предоставляет все возможности, необходимые для удовлетворения ваших требований к визуализации

2. Вы хотите, чтобы данные из каждого файла отображались в виде отдельной трассировки на этой точечной диаграмме? Или вы хотите построить график v(t) в time виде одной трассировки, используя объединенные данные из всех этих файлов?

3. @ДерекО : Да, я ошибся, назвав это точечной диаграммой, я хочу построить график v(t) против времени, чтобы получить линейный график.

4. @RobRaymond: Да, все файлы имеют две колонки, и на данный момент я не возражаю против легенды, так как я только хочу проверить, являются ли данные надежными.

5. @Michele — так работает решение, которое я привел ниже. просто измените px.line , если вам нужны линии вместо точечной фигуры

Ответ №1:

  • сгенерировали 100 резюме для демонстрации
  • pathlib-это более питонический / OO подход к взаимодействию с файловой системой и, следовательно, glob()
  • самый простой подход с plotly-использовать Plotly Express для создания всех трассировок. Мы использовали подход подготовки всех данных в одном фрейме данных pandas, чтобы сделать это очень простым
  • согласно комментариям, фигура с таким количеством следов и, следовательно, такой длинной легендой может быть не лучшей визуализацией того, чего вы пытаетесь достичь. Подумайте, что вам нужно визуализировать и настроить решение для достижения лучшей визуализации
 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",
)
 

введите описание изображения здесь