Download This Notebook: Plotting.ipynb



This tutorial describes skrf’s plotting features. If you would like to use skrf’s matplotlib interface with skrf styling, start with this

%matplotlib inline
import skrf as rf
/home/docs/checkouts/ UserWarning: Style includes a parameter, 'interactive', that is not related to style.  Ignoring
  "to style.  Ignoring".format(key))

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.

from skrf import Network

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

Another common option is to draw addmitance contours, instead of impedance. This is controled through the chart_type argument.


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.


from matplotlib import pyplot as plt
plt.axis('equal') # otherwise circles wont be circles
(-0.855165798772, 0.963732138327, -0.8760764348472001, 0.9024032182652001)


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,


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,

from 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')


Plot phase,


Or unwrapped phase,


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

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

plt.ylabel('Group Delay (ns)')
plt.title('Group Delay of Ring Slot S21')
Text(0.5,1,'Group Delay of Ring Slot S21')

Impedance, Admittance

The components the Impendance and Admittance parameters can be plotted similarly,


Customizing Plots

The legend entries are automatically filled in with the Network’s The entry can be overidden by passing the label argument to the plot method.

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

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.

ring_slot.frequency.unit = 'mhz'

Other key word arguments given to the plotting methods are passed through to the matplotlib matplotlib.pyplot.plot function.

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')


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

from matplotlib import pyplot as plt
from matplotlib import style

with style.context('seaborn-ticks'):
    plt.xlabel('Real Part');
    plt.ylabel('Imaginary Part');
    plt.title('Smith Chart With Legend Room');

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.

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

FileNotFoundError                         Traceback (most recent call last)
~/checkouts/ in use(style)
    110             try:
--> 111                 rc = rc_params_from_file(style, use_default_template=False)
    112                 _apply_style(rc)

~/checkouts/ in rc_params_from_file(fname, fail_on_error, use_default_template)
   1132     """
-> 1133     config_from_file = _rc_params_in_file(fname, fail_on_error)

~/checkouts/ in _rc_params_in_file(fname, fail_on_error)
   1048     rc_temp = {}
-> 1049     with _open_file_or_url(fname) as fd:
   1050         try:

~/checkouts/ in __enter__(self)
     58         try:
---> 59             return next(self.gen)
     60         except StopIteration:

~/checkouts/ in _open_file_or_url(fname)
   1033             encoding = "utf-8"
-> 1034         with, encoding=encoding) as f:
   1035             yield f

FileNotFoundError: [Errno 2] No such file or directory: 'printable'

During handling of the above exception, another exception occurred:

OSError                                   Traceback (most recent call last)
<ipython-input-17-4aa103b0c60f> in <module>
      1 from skrf import plotting
----> 2 with style.context('printable'):
      3     ring_slot.plot_s_deg()
      4     plotting.add_markers_to_lines()
      5     plt.legend() # have to re-generate legend

~/checkouts/ in __enter__(self)
     57     def __enter__(self):
     58         try:
---> 59             return next(self.gen)
     60         except StopIteration:
     61             raise RuntimeError("generator didn't yield") from None

~/checkouts/ in context(style, after_reset)
    146         mpl.rcdefaults()
    147     try:
--> 148         use(style)
    149     except:
    150         # Restore original settings before raising errors during the update.

~/checkouts/ in use(style)
    115                     "{!r} not found in the style library and input is not a "
    116                     "valid URL or path; see `style.available` for list of "
--> 117                     "available styles".format(style))

OSError: 'printable' not found in the style library and input is not a valid URL or path; see `style.available` for list of available styles