Ejemplo n.º 1
0
def find_col(data, col_type, label=None):
    """
	Finds column containing the desired measurement

	Parameters
	___________
	data: DataFrame
		DataFrame containing the full data set
	col_type: one of {'current', 'potential', 'time', 'current_err', 'potential_err', 'overpotential', 'tafelcurrent', 'realcurr', 'imagcurr'}
		Type of data being searched for
	label: str or int (default=None)
		Label or index of the desired column if the column label cannot be automatically parsed

	Returns
	________
	col: numpy array
		Array of the desired measurement values
	"""
    default_label = col_default_labels[col_type]
    default_id = col_default_ids[col_type]
    newdf = data.copy()
    newdf.columns = utils.check_labels(newdf)
    if default_label in newdf.columns:
        col = newdf[default_label]
    elif label:
        if utils.check_str(label):
            col = newdf[label]
        else:
            col = newdf.iloc[:, label]
    else:
        col = newdf.iloc[:, default_id]
    col = np.asarray(col)
    return col
Ejemplo n.º 2
0
def plot_tafel(data=None,
               use_all=False,
               fig=None,
               ax=None,
               labels=None,
               line=False,
               scatter=True,
               errs=False,
               current_column=3,
               potential_column=2,
               err_column=3,
               xunits='',
               yunits='V',
               plot_slope=True,
               imin=None,
               imax=None,
               export_name=None,
               export_type='png',
               fig_kw={},
               **plot_kw):
    if data is None:
        return None
    if fig is None and ax is None:
        fig, ax = plt.subplots(**fig_kw)
    for d in data:
        if (not use_all) and d.get_expt_type() != 'lsv':
            continue
        this_data = d.get_processed_data()
        this_data.columns = utils.check_labels(this_data)
        this_label = d.get_label()
        # x = np.array(df['log(i)'])
        # y = np.array(df['eta'])
        # print('here')
        x = datums.find_col(this_data, 'tafelcurrent', current_column)
        y = datums.find_col(this_data, 'overpotential', potential_column)
        plotter(ax, x, y, None, this_label, line, scatter, errs, None,
                **plot_kw)
        if plot_slope:
            if imin is None:
                imin = min(x)
            if imax is None:
                imax = max(x)
            ax.axvline(x=imin, c='red', lw=0.5)
            ax.axvline(x=imax, c='red', lw=0.5)
            a, b, r2, itrim, vtrim = datums.tafel_slope(x, y, imin, imax)
            d.set_tafel_slope(a)
            d.set_exchg_curr(b)
            d.set_tafel_rsq(r2)
            vfit = datums.tafel_eqn(itrim, b, a)
            ax.scatter(itrim, vfit, s=1, c='orange', zorder=200)
    if len(data) > 1:
        ax.legend(loc='best', edgecolor='k')
    ax.set_xlabel('log(current)')
    ax.set_ylabel(build_axlabel('Overpotential', yunits))
    if export_name:
        fig_saver(export_name, export_type)
    return fig, ax
Ejemplo n.º 3
0
def plot_lsv(data=None,
             use_all=False,
             fig=None,
             ax=None,
             labels=None,
             line=False,
             scatter=True,
             errs=False,
             current_column=1,
             potential_column=2,
             err_column=3,
             xunits='V',
             yunits=r'$mA/cm^2$',
             export_name=None,
             export_type='png',
             fig_kw={},
             **plot_kw):
    """
	Plot linear sweep voltammetry data

	Parameters
	___________
	data: Datum object(default=None)
		Datum object containing LSV data
	labels: array-like (default=None)
		List of labels to be used in the legend. If unspecified, keys of data are used as labels.
	line: bool (default=True)
		Whether to draw a line connecting the individual data points
	scatter: bool (default=False)
		Whether to draw a marker at each data point
	errs: bool (default=False)
		Whether to include an error bar at each data point
	current_column: int or str (default=1)
		Index or label of the column containing current data. Used only if automatic column identification fails
	potential_column: int or str (default=0)
		Index or label of the column containing potential data. Used only if automatic column identification fails
	err_column: int or str (default=3)
		Index or label of the column containing data to draw error bars. Used only if automatic column identification fails. Ignored if errs=False
	xunits: str (default='V')
		Units of the x-axis
	yunits: str (default=r'$mA/cm^2$')
		Units of the y-axis
	export_name: str, path object, or file-like (default=None)
		If specified, the figure will be saved as an image. Can either be a complete file path to save the image in a specific directory or a file name to save the image in the current directory
	export_type: str (default='png')
		File type to save the image as. Only used if export_name is specified and export_name does not include the file type
	fig_kw: dict
		Dict with keywords passed to the plt.subplots function to create the figure
	err_kw: dict
		Dict with keywords passed to the plt.errorbars function used to draw errorbars
	**plot_kw:
		all remaining keyword arguments are passed to the plt.plot or plt.scatter function used to draw the graphs

	Returns
	________
	fig: Figure
		Figure object containing all plot elements
	ax: Axes
		Axes object containing the plotted data
	"""
    if data is None:
        return None
    if fig is None and ax is None:
        fig, ax = plt.subplots(**fig_kw)
    for d in data:
        if (not use_all) and d.get_expt_type() != 'lsv':
            continue
        this_data = d.get_processed_data()
        this_data.columns = utils.check_labels(this_data)
        this_label = d.get_label()
        x = datums.find_col(this_data, 'overpotential', potential_column)
        y = datums.find_col(this_data, 'current', current_column)
        lines, caps, bars = plotter(ax, x, y, None, this_label, line, scatter,
                                    errs, None, **plot_kw)
        d.set_line(lines)
        d.set_errcaps(caps)
        d.set_errbars(bars)
    if len(data) > 1:
        ax.legend(loc='best', edgecolor='k')
    ax.set_xlabel(build_axlabel('Overpotential', xunits))
    ax.set_ylabel(build_axlabel('Current Density', yunits))
    # ymin = min(y) - 0.01 * min(y)
    # ymax = max(y) + 0.01 * max(y)
    # ax.set_ylim((ymin, ymax))
    if export_name:
        fig_saver(export_name, export_type)
    return fig, ax
Ejemplo n.º 4
0
def plot_cp_raw(data=None,
                use_all=False,
                fig=None,
                ax=None,
                labels=None,
                line=False,
                scatter=True,
                errs=False,
                current_column=2,
                potential_column=1,
                time_column=0,
                err_column=(4, 5),
                xunits='s',
                yunits=('V', 'mA'),
                export_name=None,
                export_type='png',
                fig_kw={},
                err_kw={},
                **plot_kw):
    """
	Plot raw chronopotentiometry data

	Note: it is strongly reccomended to use this function with data from only a single test and the default values of line, scatter, and errs to avoid overplotting.

	Parameters
	___________
	data: Datum object(default=None)
		Datum object containing CP data
	labels: array-like (default=None)
		List of labels to be used in the legend. If unspecified, keys of data are used as labels.
	line: bool (default=True)
		Whether to draw a line connecting the individual data points
	scatter: bool (default=False)
		Whether to draw a marker at each data point
	errs: bool (default=False)
		Whether to include an error bar at each data point
	current_column: int or str (default=2)
		Index or label of the column containing current data. Used only if automatic column identification fails
	potential_column: int or str (default=1)
		Index or label of the column containing potential data. Used only if automatic column identification fails
	time_column: int or str (default=0)
		Index or label of the column containing time data. Used only if automatic column identification fails
	err_column: tuple or list of int or str (default=(4,5))
		Indices or labels of the columns containing data to draw error bars. Used only if automatic column identification fails. Ignored if errs=False
	xunits: str (default=r'$mA/cm^2$')
		Units of the x-axis
	yunits: tuple or list of str (default=('ma','V'))
		Units of the y-axis
	export_name: str, path object, or file-like (default=None)
		If specified, the figure will be saved as an image. Can either be a complete file path to save the image in a specific directory or a file name to save the image in the current directory
	export_type: str (default='png')
		File type to save the image as. Only used if export_name is specified and export_name does not include the file type
	fig_kw: dict
		Dict with keywords passed to the plt.subplots function to create the figure
	err_kw: dict
		Dict with keywords passed to the plt.errorbars function used to draw errorbars
	**plot_kw:
		all remaining keyword arguments are passed to the plt.plot or plt.scatter function used to draw the graphs

	Returns
	________
	fig: Figure
		Figure object containing all plot elements
	ax: Tuple
		Tuple of axes objects containing the plotted data
	"""
    if data is None:
        return None
    if fig is None and ax is None:
        fig, ax = plt.subplots(**fig_kw)
    ax2 = ax.twinx()
    color1 = 'tab:red'
    color2 = 'tab:blue'
    for d in data:
        if (not use_all) and d.get_expt_type() != 'cp':
            continue
        this_data = d.get_raw_data()
        this_data.columns = utils.check_labels(this_data)
        this_label = d.get_label()
        x = datums.find_col(this_data, 'time', time_column)
        y1 = datums.find_col(this_data, 'potential', potential_column)
        y2 = datums.find_col(this_data, 'current', current_column)
        yerr1 = check_errs(errs, this_data, 'potential_err', err_column[0])
        yerr2 = check_errs(errs, this_data, 'current_err', err_column[1])
        plotter(ax,
                x,
                y1,
                yerr1,
                this_label,
                line,
                scatter,
                errs,
                err_kw,
                c=color1,
                **plot_kw)
        plotter(ax2,
                x,
                y2,
                yerr2,
                this_label,
                line,
                scatter,
                errs,
                err_kw,
                c=color2,
                **plot_kw)
    if len(data) > 1:
        ax.legend(loc='best', edgecolor='k')
    # color = 'tab:red'
    ax.set_xlabel(build_axlabel('Time', xunits))
    ax.set_ylabel(build_axlabel('Potential', yunits[0]))
    ax2.set_ylabel(build_axlabel('Current', yunits[1]))
    ax.tick_params(axis='y', labelcolor=color1)
    ax2.tick_params(axis='y', labelcolor=color2)
    if export_name:
        fig_saver(export_name, export_type)
    return fig, (ax, ax2)