Iwan Phillips
Iwan Phillips

Reputation: 33

ValueError: Points must be Nx2 array, got 2x5

I'm trying to make an animation and am looking at the code of another stack overflow question. The code is the following

import matplotlib.pyplot as plt
from matplotlib import animation as animation
import numpy as np
import pandas as pd
import io

u = u"""Time    M1  M2  M3  M4  M5
1       1   2   3   1   2
2       1   3   3   1   2
3       1   3   2   1   3
4       2   2   3   1   2
5       3   3   3   1   3
6       2   3   4   1   4
7       2   3   4   3   3
8       3   4   4   3   4
9       4   4   5   3   3
10      4   4   5   5   4"""

df_Bubble = pd.read_csv(io.StringIO(u), delim_whitespace=True)

time_count = len(df_Bubble) 
colors = np.arange(1, 6) 
x = np.arange(1, 6) 
max_radius = 25 
fig, ax = plt.subplots() 
pic = ax.scatter(x, df_Bubble.iloc[0, 1:], s=100, c=colors) 
pic.set_offsets([[np.nan]*len(colors)]*2)
ax.axis([0,7,0,7])

def init(): 
    pic.set_offsets([[np.nan]*len(colors)]*2)
    return pic,

def updateData(i): 
    y = df_Bubble.iloc[i, 1:] 
    area = np.pi * (max_radius * y / 10.0) ** 2 
    pic.set_offsets([x, y.values]) 
    pic._sizes = area
    i+=1 
    return pic, 

ani = animation.FuncAnimation(fig, updateData, 
      frames=10, interval = 50, blit=True, init_func=init) 

plt.show()

When I run this code unchanged I get the error

ValueError: Points must be Nx2 array, got 2x5

I have looked at similar threads on this question and have come to the conclusion that the problem has to do with the line with [[np.nan]*len(colors)]*2. Based on the examples I found, I thought that changing a part of this line to an array might help, but none of my attempts have worked, and now I'm stuck. I would be grateful for any help.

Upvotes: 0

Views: 314

Answers (1)

Nikolaos Chatzis
Nikolaos Chatzis

Reputation: 1979

set_offsets expects a Nx2 ndarray and you provide 2 arrays with 5 elements each in updateData(i) and 2 lists with 5 elements each in init()

def init(): 
    pic.set_offsets(np.empty((len(colors),2)))
    return pic,

def updateData(i):
    y = df_Bubble.iloc[i, 1:] 
    area = np.pi * (max_radius * y / 10.0) ** 2
    #pic.set_offsets(np.hstack([x[:i,np.newaxis], y.values[:i, np.newaxis]]))
    pic.set_offsets(np.transpose((x, y.values)))
    pic._sizes = area
    i+=1 
    return pic,

Upvotes: 1

Related Questions