今天给大家准备的是动态更新的动态图,上次在b站见到了,便想着来做,正好又在猪哥的公号看到了这个知识点,就马不停蹄的我就开始练习,下面是效果图。
材料: python3
matplotlib
数据获取地址:http://piaofang.maoyan.com/dashboard?movieId=1277644猫眼电影票房。
首先进行数据的获取,接口很容易找,看到点击下一天并不会出现网址我们就可以知道是动态获取的网页。找到json接口后我们对它进行所需数据的获取便可。
之后因为我们需要的是多天的票房数据,所以我们也需要对url地址进行遍历,最后再将获取的数据保存下来以便后续处理。
获取数据的代码如下
url_lst = []
for i in range(19):
url = 'http://piaofang.maoyan.com/second-box?beginDate='+str(int(20191201+i))
url_lst.append(url)
def use_url(url,time):
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36',
}
res = requests.get(url=url,headers=headers)
res.encoding='utf-8'
data = res.json()
dict = []
for i in data['data']['list']:
dic = {}
dic['电影']=i['movieName']
dic['票房']=i['boxInfo']
dic['日期'] = time
dict.append(dic)
return dict
data_lst = []
time = 20191201
for j in url_lst:
data_lst.extend(use_url(j,time))
time+=1
df_result = pd.DataFrame(data_lst)
print(df_result)
df_result.to_csv(r'票房.csv',encoding='utf-8')#导入到excel文件
数据获取好后我们就可以开始准备画图处理啦,我这里选取了几个电影做例子。
df = pd.read_csv('E:\pythonlian1\票房.csv',encoding="gbk")
df1=df[(df['日期']>=20191205)&(df['电影']=='冰雪奇缘2')|(df['电影']=='误杀')|(df['电影']=='冰雪奇缘2')|(df['电影']=='中国机长')|(df['电影']=='勇敢者游戏2:再战巅峰')]
print(df1)
然后准备好各行的颜色分配
colors = dict(zip(
dff['电影'],
['#adb0ff', '#ffb3ff', '#90d595', '#e48381', '#cccc4d',
'#aafbff', '#f7bb5f', '#eafb50', '#ffb3e6', '#4169e1']
))
print(colors)
我们直接先画出静态的图表
代码部分也只是照猫画虎,去除边框加上线条,设置字体位置与大小,再配上颜色
fig, ax = plt.subplots(figsize=(15, 8))
def draw_barchart(year):
dff = df1[df1['日期'].eq(year)].sort_values(by='票房', ascending=True).tail(10)
ax.clear()
ax.barh(dff['电影'], dff['票房'], color=[colors[x] for x in dff['电影']])
for i, (value, name) in enumerate(zip(dff['票房'], dff['电影'])):
ax.text(value, i, name, size=14, weight=600, ha='right', va='bottom')
ax.text(value, i, f'{value:,.0f}', size=14, ha='left', va='center')
ax.text(1, 0.4, year, transform=ax.transAxes, color='#777777', size=46, ha='right', weight=800)
ax.text(0, 1.06, '票房数量', transform=ax.transAxes, size=12, color='#777777')
ax.xaxis.set_ticks_position('top')
ax.set_yticks([])
ax.margins(0, 0.01)
ax.grid(which='major', axis='x', linestyle='-')#线条布置
ax.set_axisbelow(True)
ax.text(0, 1.12, '票房变化',
transform=ax.transAxes, size=24, weight=600, ha='left')
plt.box(False) #是否带边框
draw_barchart(20191219)
对于动图的绘制,我们可以使用matplotlib中的animation,配置几个参数传入之前静态图的函数中就可以了
import matplotlib.animation as animation
from IPython.display import HTML
fig, ax = plt.subplots(figsize=(15, 8))
animator = animation.FuncAnimation(fig, draw_barchart, frames=range(20191202, 20191219))
HTML(animator.to_jshtml())
大功告成,成品就会同开始的那幅图一样,它有好几个参数可以设置,比如这里没添加的帧数之类,可参考https://www.cnblogs.com/zhouzhe-blog/p/9614360.html
大家可以看看。