%matplotlib inline
import skrf as rf
rf.stylely()

"""
Explanation: Plotting
Introduction
This tutorial describes skrf's plotting features.  If you would like to use skrf's matplotlib interface with skrf styling, start with this
End of explanation
"""


from skrf import Network

ring_slot = Network('data/ring slot.s2p')
ring_slot.plot_s_smith()

ring_slot.plot_s_smith(draw_labels=True)

"""
Explanation: Plotting Methods
Plotting functions are implemented as methods of the Network class.

Network.plot_s_re
Network.plot_s_im
Network.plot_s_mag
Network.plot_s_db
...

Similar methods exist for Impedance (Network.z) and Admittance Parameters (Network.y), 

Network.plot_z_re
Network.plot_z_im
...
Network.plot_y_re
Network.plot_y_im
...

Smith Chart
As a first example, load a Network and plot all four  s-parameters on the Smith chart.
End of explanation
"""


ring_slot.plot_s_smith(chart_type='y')

"""
Explanation: Another common option is to draw addmitance contours, instead of impedance. This is controled through the  chart_type argument.
End of explanation
"""


ring_slot.plot_s_complex()

from matplotlib import pyplot as plt
plt.axis('equal') # otherwise circles wont be circles

"""
Explanation: See skrf.plotting.smith() for more info on customizing the Smith Chart. 
Complex Plane
Network parameters can also be plotted in the complex plane without a Smith Chart through Network.plot_s_complex.
End of explanation
"""


ring_slot.plot_s_db()

"""
Explanation: Log-Magnitude
Scalar components of the complex network parameters can be plotted vs 
frequency as well. To plot the log-magnitude of the s-parameters vs. frequency,
End of explanation
"""


from skrf.data import ring_slot_meas
ring_slot.plot_s_db(m=0,n=0, label='Theory') 
ring_slot_meas.plot_s_db(m=0,n=0, label='Measurement') 

"""
Explanation: When no arguments are passed to the plotting methods, all parameters are plotted. Single parameters can be plotted by passing indices m and n to the plotting commands (indexing start from 0). Comparing the simulated reflection coefficient off the ring slot to a measurement,
End of explanation
"""


ring_slot.plot_s_deg()

"""
Explanation: Phase
Plot phase,
End of explanation
"""


ring_slot.plot_s_deg_unwrap()

"""
Explanation: Or unwrapped phase,
End of explanation
"""


gd = abs(ring_slot.s21.group_delay) *1e9 # in ns

ring_slot.plot(gd)
plt.ylabel('Group Delay (ns)')
plt.title('Group Delay of Ring Slot S21')

"""
Explanation: Phase is radian (rad) is also available
Group Delay
A Network has a plot() method which creates a rectangular plot of the argument vs frequency.  This can be used to make plots are arent 'canned'. For example group delay
End of explanation
"""


ring_slot.plot_z_im()

ring_slot.plot_y_im()

"""
Explanation: Impedance, Admittance
The components the Impendance and Admittance parameters can be plotted 
similarly,
End of explanation
"""


ring_slot.plot_s_db(m=0,n=0, label = 'Simulation')

"""
Explanation: Customizing Plots
The legend entries are automatically filled in with the Network's Network.name. The entry can be overidden by passing the label argument to the plot method.
End of explanation
"""


ring_slot.frequency.unit = 'mhz'
ring_slot.plot_s_db(0,0)

"""
Explanation: The frequency unit used on the x-axis is automatically filled in from 
the Networks Network.frequency.unit attribute. To change
the label, change the frequency's unit.
End of explanation
"""


ring_slot.frequency.unit='ghz'
ring_slot.plot_s_db(m=0,n=0, linewidth = 3, linestyle = '--', label = 'Simulation')
ring_slot_meas.plot_s_db(m=0,n=0, marker = 'o', markevery = 10,label = 'Measured')


"""
Explanation: Other key word arguments given to the plotting methods are passed through to the matplotlib matplotlib.pyplot.plot function.
End of explanation
"""


from matplotlib import pyplot as plt
from matplotlib import style 

with style.context('seaborn-ticks'):
    ring_slot.plot_s_smith()
    plt.xlabel('Real Part');
    plt.ylabel('Imaginary Part');
    plt.title('Smith Chart With Legend Room');
    plt.axis([-1.1,2.1,-1.1,1.1])
    plt.legend(loc=5)
   

"""
Explanation: All components of the plots can be customized through  matplotlib functions, and styles can be used with a context manager.
End of explanation
"""


from skrf import plotting
with style.context('printable'):
    ring_slot.plot_s_deg()
    plotting.add_markers_to_lines()
    plt.legend() # have to re-generate legend


"""
Explanation: Saving Plots
Plots can be saved in various file formats using the GUI provided by the matplotlib. However, skrf provides a convenience function, called skrf.plotting.save_all_figs,  that allows all open figures to be saved to disk in multiple file formats, with filenames pulled from each figure's title,
from skrf.plotting import save_all_figs
save_all_figs('data/', format=['png','eps','pdf'])

Adding Markers Post Plot
A common need is to make a color plot, interpretable in greyscale print. 
The skrf.plotting.add_markers_to_lines  adds different markers each line in a plots after the plot has been made, which is usually when you remember to add them.
End of explanation
"""


