绘制自动电影票房变化图制作b站同款自动动态更新柱状图

今天给大家准备的是动态更新的动态图,上次在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
大家可以看看。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值