0

Strange question, I have a script which creates a matplotlib 3d scatter plot and then saves it to a PNG file. The script is: plot_data.py It is shown below:

from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
from matplotlib import cm
#import numpy as np
import argparse
import os
from pylab import *




def get_data(filename):
    data = []
    with open(filename) as F:
        for line in F:
            splitted = line.split(sep=',')
            formatted = (int(x) for x in splitted)
            data.append(formatted)
    return list(map(list, zip(*data)))

def create_plot(data, save_file):

    fig = plt.figure()
    ax = fig.gca(projection='3d')        
    cset = ax.scatter(xs=data[0], ys=data[1], zs=data[2])        
    ax.set_xlabel('DAC0')        
    ax.set_ylabel('DAC1')
    ax.set_zlabel('RSSI')
    fig.set_size_inches(18,12)
    savefig(save_file, dpi=200, transparent=True, bbox_inches='tight', pad_inches=0)


if __name__ == '__main__':


    parser = argparse.ArgumentParser( description = "Visualize the data")
    parser.add_argument('path', help="The path to the data file to visualize")
    parser.add_argument('result_image', help="The path to where the resultant png image should be saved")
    p = parser.parse_args()
    data = get_data(p.path)
    create_plot(data, p.result_image)

The script works just find when I call it from the command line. Like this: python plot_data.py test_data.dat test_data.png

Now, when I try and call it from another script, I run into issues. I made an example script called test_plot.py which tests the plot_data function. BTW, The commented code in test_plot.py was simply used to generate some test data.

test_plot.py is below:

from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
from matplotlib import cm
import argparse
import os
from pylab import *

from itertools import product



from plot_data import create_plot
from random import randint



if __name__ == '__main__':


    #grid = product(range(5), range(5))
    #xs, ys = list(map(list, zip(*grid)))
    #zs = [randint(0,10) for i in range(len(xs))]
    #my_gen = ('{},{},{}\n'.format(x,y,z) for x,y,z in zip(xs,ys,zs))
    #with open('test_data.dat', 'w') as F:
    #    for x,y,z in zip(xs, ys, zs):
    #        F.writelines(my_gen)

    input_file = r"test_data.dat"
    output_file = r"test_data.png"

    create_plot(input_file, output_file)

When I run this script I get the following output:

c:\projects\a>python test_plot.py
Traceback (most recent call last):
  File "test_plot.py", line 31, in <module>
    create_plot(input_file, output_file)
  File "c:\projects\a\plot_data.py", line 29, in create_
plot
    cset = ax.scatter(xs=data[0], ys=data[1], zs=data[2])
  File "C:\Users\gkuhn\AppData\Local\Continuum\Anaconda3\lib\site-packages\mpl_toolkits\mp
lot3d\axes3d.py", line 2240, in scatter
    patches = Axes.scatter(self, xs, ys, s=s, c=c, *args, **kwargs)
  File "C:\Users\gkuhn\AppData\Local\Continuum\Anaconda3\lib\site-packages\matplotlib\axes
\_axes.py", line 3660, in scatter
    self.add_collection(collection)
  File "C:\Users\gkuhn\AppData\Local\Continuum\Anaconda3\lib\site-packages\matplotlib\axes
\_base.py", line 1459, in add_collection
    self.update_datalim(collection.get_datalim(self.transData))
  File "C:\Users\gkuhn\AppData\Local\Continuum\Anaconda3\lib\site-packages\matplotlib\coll
ections.py", line 189, in get_datalim
    offsets = np.asanyarray(offsets, np.float_)
  File "C:\Users\gkuhn\AppData\Local\Continuum\Anaconda3\lib\site-packages\numpy\core\nume
ric.py", line 514, in asanyarray
    return array(a, dtype, copy=False, order=order, subok=True)
ValueError: could not convert string to float: 't'

c:\projects\a>

If it helps, I am using the anaconda distribution of Python3 64bit on Windows. I presume the problem is some form of namespacing thing?

1 Answer 1

1

create_plot takes a data set as first parameter, not a file name.

You should fix your test script like this:

from plot_data import create_plot, get_data
(...)
create_plot(get_data(input_file), output_file)

or modify your create_plot to take a file name as first parameter.

Due to python being dynamically typed, it's hard to detect such issues (you could assert on object types in create_plot or write documentation to help you remember that first parameter is a dataset)

Sign up to request clarification or add additional context in comments.

2 Comments

Thanks! This is what happens when coding with lack of sleep! This is such an embarrassing question, the shame!
it happened to the best ;-) Someone, an external eye is needed to spot the obvious.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.