有没有人知道如何更新函数散布的s参数而不必再次将x和y作为参数?我正在尝试制作一个动画,其中散射圆的大小增加,但我可以让它工作的唯一方法要求我每次更新区域时都将x和y作为参数。
这是我正在处理的代码:
#population plot
#plots a graph of the input from a file
import matplotlib.pyplot as plt;
import classplace as p;
import matplotlib.animation as amt
def animate(i, population, latitude, longitude, colour):
scalefactor = 0.00005;
area = [];
for n in population:
area.append(n*scalefactor*i);
plt.scatter(longitude, latitude, s = area, c = colour);
del area;
try:
readFile = open("GBplaces.csv", "r");
except:
print("Something went wrong! Can't open the file GBplaces.csv!\n");
else:
header = False;
places = [];
#stores the data in a list, where each element of the list is of class place, converting when necessary.
#Stores the header in a string
for line in readFile:
if(line[0] != '%'):
words = line.rstrip();
words = words.split(',');
places.append(p.Place(words[0], words[1], int(words[2]), float(words[3]), float(words[4])));
#closes readFile
readFile.close();
#creates an array of colours where cities are green and towns are yellow
#creates an array of longitude
#creates an array of latitude
#creates an array of population
colour = [];
longitude = [];
latitude = [];
population = [];
for n in range(p.Place.numcities + p.Place.numtowns):
if(places[n].tipe == "City"): colour.append("g");
else: colour.append("y");
longitude.append(places[n].longitude);
latitude.append(places[n].latitude);
population.append(places[n].population);
fig = plt.figure();
ani = amt.FuncAnimation(fig, animate, frames=50, fargs = (population, latitude, longitude, colour), interval=0.1, repeat = False, blit = False)
plt.show()
其中classplace是具有类定义的文件
#classplace.py
#place class definition
class Place:
numcities = 0;
numtowns = 0;
def __init__(self, name, tipe, population, latitude, longitude):
self.name = name;
self.tipe = tipe;
self.population = population;
self.latitude = latitude;
self.longitude = longitude;
if(self.tipe == "City"): Place.numcities += 1;
elif(self.tipe == "Town"): Place.numtowns += 1;
else:
print("Instance is not allowed. You need to specify if %s is a City or Town.\n" %(self.name));
del self;
如果我只能更新该区域,效率会好得多。 谢谢您的帮助!
答案 0 :(得分:0)
scatter
返回matplotlib.collections.PathCollection
个对象。您可以使用其方法get_sizes()
和set_sizes()
来检索或设置点的大小。这是对您的示例的修改。
import matplotlib.pyplot as plt;
import matplotlib.animation as amt
# to embed animation as html5 video in Jupyter notebook
from matplotlib import rc
rc('animation', html='html5')
def animate(i, population, latitude, longitude, colour):
scalefactor = 0.001
area = [n*scalefactor*i for n in population]
# it is better to use list comprehensions here
sc.set_sizes(area)
# here is the answer to the question
return (sc,)
#creates an array of colours where cities are green and towns are yellow
#creates an array of longitude
#creates an array of latitude
#creates an array of population
# pick some random values
colour = ['g', 'g', 'y', 'y', 'y'];
longitude = [1, 2, 3, 4, 5];
latitude = [1, 3, 2, 5, 4];
population = [1000, 2000, 5000, 4000, 3000];
fig = plt.figure()
sc = plt.scatter(longitude, latitude, s=population)
# I didn't managed this to work without `init` function
def init():
return (sc,)
ani = amt.FuncAnimation(fig, animate, frames=200, init_func=init,
fargs=(population, latitude, longitude, colour),
interval=10, repeat = False, blit = True)