nectaris
nectaris

Reputation: 85

NumPy masking issue -- What am I missing?

I'm plotting diet information using matplotlib, where the x-axis represents a range of dates, and the y-axis represents the number of calories consumed. Not too complicated that, but there is one snag: not all dates have calorie information, and it would make most sense to leave those out rather than do some sort of interpolation/smoothing.

I found several good examples of using numpy masks for such situations, but it seems I'm not getting something straight, as the code that I think should produce the results I want doesn't change anything.

Have a look:

calories_list_ma = np.ma.masked_where(calories_list == 0, calories_list) plt.plot(datetimes_list, calories_list_ma, marker = 'x', color = 'r', ls = '-')

Which produces this: Sample Output

I just want there to be an unplotted gap in the line for 9-23.

And actually, I know my use of masked_where must be incorrect, because when I print calories_list_ma.mask, the result is 'False'. Not a list, as it should be, showing which values are masked/unmasked with True and False.

Can someone set me straight?

Thanks so much!

Upvotes: 2

Views: 325

Answers (2)

BrenBarn
BrenBarn

Reputation: 251365

I'm guessing from the name that your calories_list is a list. If it is a list calories_list == 0 will return one value, namely False, since the list does not equal the value 0. masked_where will then dutifully set the mask to False, resulting in an unmasked copy of your list.

You need to do calories_list = np.array(calories_list) first to make it into a numpy array. Unlike lists, numpy arrays have the "broadcasting" feature whereby calories_list == 0 compares each element individually to zero.

Upvotes: 3

Srivatsan
Srivatsan

Reputation: 9363

try using

calories_list_ma = np.ma.masked[calories_list == 0]

Upvotes: -1

Related Questions