This is a re-opening of my initial question with the same title which was closed as duplicate. As None of the suggested duplicates helped me to solve my problem, I post this question again.
I have a DataFrame with time series related to some devices which come from a hdf-file:
from matplotlib import pyplot as plt import numpy as np import pandas as pd from pandas import DataFrame def open_dataset(file_name: str, name: str, combined_frame: DataFrame): data_set: DataFrame = pd.read_hdf(file_name, key=name) data_set['name'] = name combined_frame = pd.concat([combined_frame, data_set], axis=0) return combined_frame if __name__ == '__main__': names = ['YRT1IN1E', 'YRT1LE1', 'YRT1MH1', 'YR08DT1ML'] working_frame = DataFrame() for name in names: working_frame = open_dataset('data.h5', name, working_frame) grouped_frame = working_frame.groupby('name') fig, axs = plt.subplots(figsize=(10, 5), nrows=4, ncols=1, # fix as above gridspec_kw=dict(hspace=0), sharex=True) axs = grouped_frame.get_group('YR08DT1ML').rawsum.plot() axs = grouped_frame.get_group('YRT1LE1').voltage.plot() axs = grouped_frame.get_group('YRT1MH1').current.plot() axs = grouped_frame.get_group('YRT1IN1E').current.plot() plt.show()
This produces the following output:
What am I doing wrong? I would like to have each of the plots in it’s own row, not all in one row.
The data file “data.h5” is available at: Google Drive
What I tried from the suggested posts:
Answer by joris, Mar 18, 2014 at 15:45 causes code to go into infinite loop, data is never plotted:
fig, axs = plt.subplots(nrows=2, ncols=2) grouped_frame.get_group('YR08DT1ML').rawsum.plot(ax=axs[0,0]) grouped_frame.get_group('YR...').rawsum.plot(ax=axs[0,1]) grouped_frame.get_group('YR...').rawsum.plot(ax=axs[1,0]) grouped_frame.get_group('YR...').rawsum.plot(ax=axs[1,1])
A variation is leading to same result as I described above:
axes[0,0] = grouped_frame.get_group('YR08DT1ML').rawsum.plot() axes[0,1] = grouped_frame.get_group('YR...').rawsum.plot() ...
Infinite loop happens as well for sedeh’s, Jun 4, 2015 at 15:26 answer:
grouped_frame.get_group('YR08DT1ML').rawsum.plot(subplots=True, layout=(1,2)) ...
Infinite loop happens as well for Justice_Lords, Mar 15, 2019 at 7:26 answer:
fig=plt.figure() ax1=fig.add_subplot(4,1,1) ax2=fig.add_subplot(4,1,2) ax3=fig.add_subplot(4,1,3) ax4=fig.add_subplot(4,1,4) grouped_frame.get_group('YR08DT1ML').rawsum.plot(ax=ax1) ...
It seems to me that the problem is related to the fact that I plot with a pandas.DataFrameGroupBy
and not a pandas.DataFrame
Advertisement
Answer
Seems like matplotlib was taking a long time to process the DatetimeIndex. Converting to a time and cleaning everything up did the trick:
names = ['YR08DT1ML', 'YRT1LE1', 'YRT1MH1', 'YRT1IN1E'] df = pd.concat([pd.read_hdf('data.h5', name) for name in names]) df.reset_index(inplace=True) df.index = df['time'].dt.time df.sort_index(inplace=True) fig, axes = plt.subplots(figsize=(10, 5), nrows=4, ncols=1, gridspec_kw=dict(hspace=0), sharex=True) cols = ['rawsum', 'voltage', 'current', 'current'] for ix, name in enumerate(names): df.loc[df['nomen'].eq(name), cols[ix]] .plot(ax=axes[ix]) plt.show();
Hope this helps.