Source code for preparenovonix.compare

import sys, os.path
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import preparenovonix.novonix_variables as nv
from preparenovonix.novonix_io import read_column
from preparenovonix.novonix_io import after_file_name
from preparenovonix.novonix_io import icolumn


[docs]def plot_vct(before_file, first_loop=0, plot_type="pdf", plot_show=False): """ Given two Novonix data files, pre and post-processing with preparenovonix, plot toghether their Voltage, Capacity, Step Number and Loop number versus time Parameters ----------- before_file : string Name of the pre-processed file first_loop : int Value for the Loop Number to start showing data plot_type : string 'pdf', 'png', 'jpg' for the format of the saved file plot_show : boolean True to show the plot. Notes ----- This code returns a plot. Examples --------- >>> from preparenovonix.compare import plot_vct >>> plot_vct('example_data/example_data.csv','example_data/example_data_prep.csv',first_loop=0,plot_type='pdf',plot_show=True) """ after_file = after_file_name(before_file) dirname, fname = os.path.split(os.path.abspath(after_file)) figname = os.path.join(dirname, "compare_vct." + plot_type) # Value of the loop to start the plot from val = first_loop ### Read the voltage, step number and loop number from # the processed file a_t = read_column(after_file, nv.col_t, outtype="float") a_v = read_column(after_file, nv.col_v, outtype="float") a_c = read_column(after_file, nv.col_c, outtype="float") a_s = read_column(after_file, nv.col_step, outtype="int") a_l = read_column(after_file, nv.loop_col, outtype="int") a_p = read_column(after_file, nv.line_col, outtype="int") # Find the column positions in the file icol_t = icolumn(after_file, nv.col_t) icol_v = icolumn(after_file, nv.col_v) icol_c = icolumn(after_file, nv.col_c) icol_step = icolumn(after_file, nv.col_step) ### Read the voltage and step number from the original file # Since there are failed tests, these need to be jumped data = "[Data]" ntests = 0 # Count the number of failed tests with open(before_file, "r") as ff: for line in ff: if line.strip(): # Jump empty lines if data in line: # Count failed tests for each start of file ntests += 1 idata = 0 vv = [] ss = [] tt = [] cc = [] with open(before_file, "r") as ff: for line in ff: if line.strip(): # Jump empty lines if data in line: # Count failed tests for each start of file idata += 1 if idata == ntests: # Read the header ff.readline() break for line in ff: tt.append(line.split(",")[icol_t]) vv.append(line.split(",")[icol_v]) cc.append(line.split(",")[icol_c]) ss.append(line.split(",")[icol_step]) b_t = np.asarray(tt, dtype=np.float64) b_v = np.asarray(vv, dtype=np.float64) b_c = np.asarray(cc, dtype=np.float64) b_s = np.asarray(ss, dtype=int) # Plot cols = ["navy", "salmon", "cornflowerblue", "darkred"] plt.figure(figsize=(8.0, 11.0)) gs = gridspec.GridSpec(4, 1) gs.update(wspace=0.0, hspace=0.0) fs = 15 # Plot only when the loop starts to be biggeer than val ind = np.where(a_l > val) if np.shape(ind)[1] < 1: print("WARNING compare.plot_vct: not enough data to be plotted") return astart = ind[0][0] first_a_t = a_t[astart] ind = np.where(b_t >= first_a_t) bstart = ind[0][0] # Loop number axl = plt.subplot(gs[3, :]) axl.set_xlabel(nv.col_t, fontsize=fs) axl.set_ylabel(nv.loop_col, fontsize=fs, color=cols[0]) axl.plot(a_t[astart::], a_l[astart::], cols[0], linewidth=2.5, label="Loop number") axp = axl.twinx() axp.set_ylabel("Protocol line", fontsize=fs, color=cols[2]) axp.plot( a_t[astart::], a_p[astart::], cols[2], linewidth=2.5, label="Protocol line" ) # Steps axs = plt.subplot(gs[2, :], sharex=axl) plt.setp(axs.get_xticklabels(), visible=False) axs.set_ylabel(nv.col_step, fontsize=fs) axs.plot(a_t[astart::], a_s[astart::], cols[0], linewidth=2.5, label="After") axs.plot(b_t[bstart::], b_s[bstart::], cols[1], linestyle="--", label="Before") # Voltage and capacity vs. time axv = plt.subplot(gs[:-2, :], sharex=axl) plt.setp(axv.get_xticklabels(), visible=False) axv.set_ylabel(nv.col_v, fontsize=fs) axv.plot( a_t[astart::], a_v[astart::], cols[0], linewidth=2.5, label="Potential after" ) axv.plot( b_t[bstart::], b_v[bstart::], cols[1], linestyle="--", label="Potential before" ) leg = axv.legend(loc=2, fontsize=fs - 2) ii = 0 for text in leg.get_texts(): text.set_color(cols[ii]) ii += 1 leg.draw_frame(False) axc = axv.twinx() axc.set_ylabel(nv.col_c, fontsize=fs) axc.plot( a_t[astart::], a_c[astart::], cols[2], linewidth=2.5, label="Capacity after" ) axc.plot( b_t[bstart::], b_c[bstart::], cols[3], linestyle="--", label="Capacity before" ) leg = axc.legend(loc=4, fontsize=fs - 2) ii = 2 for text in leg.get_texts(): text.set_color(cols[ii]) ii += 1 leg.draw_frame(False) plt.savefig(figname) if plot_show: plt.show() print("Plot: {}".format(figname))