#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",
)