如何处理matplotlib中的图形
我刚开始学习Python和Django,想要创建一个可以生成图表的网站。为了生成图表,我使用了matplotlib。
当我第一次运行这个页面时,一切都很好,但在刷新页面后,我得到的图表就不对了(是新旧图表混合在一起的)。
这是我的代码:
from pylab import *
...
#prepare values and labels
values = []
labels = []
values.append(float(user.playcount)/sum*100)
labels.append(user.name)
for friend in friends:
friend = friend.getInfo()
values.append(float(friend.playcount)/sum*100)
labels.append(friend.name)
# create figure
figure(1)
# set some parameters
params = { 'axes.labelsize': 6, 'text.fontsize': 6, 'font.size': 6, 'legend.fontsize': 6, 'xtick.labelsize': 6, 'ytick.labelsize': 6,}
rcParams.update(params)
# draw, add legend and save
pie(values, labels=labels, shadow=False)
l = legend(loc='lower center', ncol= 5, bbox_to_anchor=(0.5, -0.25))
l.get_frame().set_alpha(0.0)
savefig('media/images/3.png', dpi=100, transparent=True)
#close(1)
如果我取消注释close(1)这一行,刷新页面时就会出现问题,因为应用程序会在figure()这一行卡住。
有没有人能告诉我问题出在哪里?我觉得可能是图形处理有问题,但我不太清楚具体是什么。
2 个回答
0
根据Cristian Ciupitu在这个类似问题中的回答,使用figure()
而不是figure(1)
应该能解决这个问题。
4
我觉得你可以试试使用 cla()
这个方法,它可以 清空坐标轴。你可以在脚本的最开始就用它,甚至在第一次绘图之前就可以用。相比于 close()
,我更推荐用这个方法,因为如果你用 close()
,第二次运行时图形就不存在了。所以我建议把 figure(1)
这一行替换成
figure(1)
figure(1).gca().cla()
这行代码是把图形设置为图形1,然后获取当前的坐标轴(gca()
),接着用 cla()
清空它。我写了一个独立于django的脚本,这个脚本对我有效,并且模拟了我认为你想要做的事情:
from pylab import *
#prepare values and labels
values = [34,17,29,6,14]
labels = ["john","jane","jim","jason","judy"]
# create figure
figure(1)
figure(1).gca().cla()
# set some parameters
params = { 'axes.labelsize': 6, 'text.fontsize': 6, 'font.size': 6,
'legend.fontsize': 6, 'xtick.labelsize': 6,
'ytick.labelsize': 6,}
rcParams.update(params)
# draw, add legend and save
pie(values, labels=labels, shadow=False)
l = legend(loc='lower center', ncol= 5, bbox_to_anchor=(0.5, -0.25))
l.get_frame().set_alpha(0.0)
savefig('3.png', dpi=100, transparent=True)
#close(1)
values2 = [24,27,29,16,4]
labels2 = ["dave","donna","derrick","dotty","drew"]
figure(1)
figure(1).gca().cla()
# draw, add legend and save
pie(values2, labels=labels2, shadow=False)
l = legend(loc='lower center', ncol= 5, bbox_to_anchor=(0.5, -0.25))
l.get_frame().set_alpha(0.0)
savefig('4.png', dpi=100, transparent=True)
#show()
其实你可能只需要一行代码;就用这个就可以了:
figure(1).gca().cla()
不过用另一种方式可能会更清晰一些。