iron2man
iron2man

Reputation: 1827

Scatter() takes at least 2 arguments (1 given)

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

Answers (2)

MaxNoe
MaxNoe

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

Alexander Vogt
Alexander Vogt

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

Related Questions