Reputation: 1827
I'm new to this and I'm trying to represent a structured array, npy file as a scatter plot. I'm not entirely sure what my other argument should be. I was thinking that I should span out my values for x
and y
, but I am not sure.
import matplotlib.pyplot as plt
import numpy as np
import os
path = '/users/username/Desktop/untitled folder/python files/MSII_phasespace/'
os.chdir( path )
data = np.load('msii_phasespace.npy',mmap_mode='r')
# data.size: 167197
# data.shape: (167197,)
# data.dtype: dtype([('x', '<f4'), ('y', '<f4'), ('z', '<f4'),
# ('velx', '<f4'), ('vely', '<f4'), ('velz', '<f4'), ('m200', '<f4')])
plt.title ("MS II data structure")
plt.xlabel(r'$\Omega_{\mu \nu}$')
plt.ylabel(r'$\Omega^{\mu \nu}$')
plt.scatter(data)
plt.show()
Inputting this outputs the error:
TypeError: scatter() takes at least 2 arguments (1 given)
Upvotes: 3
Views: 5181
Reputation: 14987
plt.scatter
needs at least two arguments (which the error states quite clearly).
If you look into the docs (http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.scatter), you will see this signature:
scatter(x, y, s=20, c=None, marker='o', cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None, hold=None, data=None, **kwargs)
So you need to provide at least an array for each x
and y
values:
plt.scatter(data['x'], data['y'])
Starting from matplotlib 1.5, you could also use this syntax to access data from a structured array:
plt.scatter('x', 'y', data=data)
Upvotes: 1
Reputation: 18098
You have a structured array there. Matplotlib does not know what to do with it. As given in the documentation for matplotlib.pyplot.scatter()
you need to specify two input arrays x
, and y
.
From the dtype
output, I gather that your structured array has values for 'x'
, 'y'
, 'z'
, 'velx'
, 'vely'
, 'velz'
, and 'm200'
. I have no clue what they are, but in order to create a scatter plot, you need to specify two components, e.g.:
plt.scatter(data['x'], data['y'])
Assuming that 'm200'
should be mapped to the width of the scatter points, you could use:
plt.scatter(data['x'], data['y'], s=data['m200'])
Upvotes: 0