The matplotlib examples api/two_scales.py & pylab_examples/shared_axis_demo.py may be what you require to display your data. Though I must admit to not having tried both at the same time 
For extracting data my personal preference is to use the csv module with generators and regular expressions - keeping results in namedtuples. Quickly written example for your data:
# -*- mode: python tab-width: 4 coding: utf-8 -*-
# tested with Python 2.6
from future_builtins import map
import csv
import re
from collections import deque, namedtuple
import numpy as np
RowTuple = namedtuple('RowTuple', 'freq col1 col2 col3')
ColumnTuple = namedtuple('ColumnTuple', 'magnitude phase')
DequeTuple = namedtuple('DequeTuple', 'freq magnitude1 phase1 magnitude2 phase2 magnitude3 phase3')
def readLTSpice(filename):
# try codec.open() if not ascii
with open(filename, 'rb') as fp:
fp.next() # discard the first row
for row in csv.reader(fp, delimiter='\t'):
yield RowTuple(*row)
def splitColumn(col):
# use a regular expression to extract floating point number
# n.b. regular expressions are cached by the re module
exp = re.compile(r"[+-]? *(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?")
return ColumnTuple(*map(float, exp.findall(col)))
def processFile(filename):
rows = readLTSpice(filename)
rows = (RowTuple(row.freq, splitColumn(row.col1), splitColumn(row.col2), splitColumn(row.col3)) for row in rows)
# if there is a large number of points then deque() is more efficient
# than lists as there is no copying when more memory is required
result = DequeTuple(deque(), deque(), deque(), deque(), deque(), deque(), deque())
for row in rows:
result.freq.append(row.freq)
result.magnitude1.append(row.col1.magnitude)
result.magnitude2.append(row.col2.magnitude)
result.magnitude3.append(row.col3.magnitude)
result.phase1.append(row.col1.phase)
result.phase2.append(row.col2.phase)
result.phase3.append(row.col3.phase)
return result
processed = processFile('ltspice.data')
# convert to numpy arrays for use with matplotlib
freq = np.asarray(processed.freq)
magnitude1 = np.asarray(processed.magnitude1)
magnitude2 = np.asarray(processed.magnitude2)
magnitude3 = np.asarray(processed.magnitude3)
phase1 = np.asarray(processed.phase1)
phase2 = np.asarray(processed.phase2)
phase3 = np.asarray(processed.phase3)
# ready for plotting...
Stephen Evans
···
On 04/12/2010 02:34, K. Larsen wrote:
The LTSpice circuit simulation program outputs a file that looks like this:
Freq. V(n003) V(n005) V(n007)
1.00000e+000 (-1.68072e+002dB,1.79085e+002�)
(-1.71453e-006dB,-3.60000e-002�) (-8.40364e+001dB,8.99964e+001�)
1.07177e+000 (-1.66868e+002dB,1.79145e+002�)
(-1.96947e-006dB,-3.85838e-002�) (-8.34343e+001dB,8.99961e+001�)
1.14870e+000 (-1.65664e+002dB,1.79202e+002�)
(-2.26233e-006dB,-4.13531e-002�) (-8.28323e+001dB,8.99959e+001�)
...
As can be seen there are 4 tab-delimited columns. The first column is
the dependent (horizontal) axis and represents Frequency. The
following 3 columns each contain 2 comma-delimited data points
including their units. These are the magnitude expressed in decibels
and the phase expressed in degrees.
I'd like to be able to plot this file. 6 separate plots should
result, or 3 pairs of 2 waveforms that share the same plot yet have 2
different axes. What is the best method to accomplish this?