之前逛微博时,看到爱豆排行榜 动态条形图,觉得很好奇,感觉这个动态图用到工作汇报中去会很炫酷,想尝试自己做一下。

  搜索了一圈的资料发现是用d3.js做的,而且很麻烦,所以决定先用熟悉的Python实现一下。解决了重重问题终于绘制出了 python版的动态条形图
  

一、先看下绘制好的动态条形图

  ​

图1 娱乐圈男明星排行榜动态条形图

数据来源:123粉丝网

  图1是用第500期(截止2019年7月6日)到538期(截止2020年3月28日)的数据绘制的动态条形图。我是爬虫爬下来的数据,如果不想爬虫可直接到公众号中回复 "娱乐圈排行榜条形图" ,即可获取数据。

  

二、绘制动态条形图代码分步解析

  ​

1 导入库并加载数据
import matplotlib.pyplot as plt
import matplotlib
import numpy as np
import pandas as pd
from pandas import concat
import os
​
os.chdir(r"F:\微信公众号\Python\21.娱乐圈排行榜\2.绘制动图条形图")  # 修改当前程序操作的路径
star_man = pd.read_csv("star_man.csv")  #读取数据
star_man = star_man.iloc[1:,:]          #去除第一行无用数据

代码解析:

import: 加载绘图库、数据处理库、文件路径管理库;

os.chdir: 设置python的工作路径,可以替换成你的路径;

star_man: 读取男明星排行榜数据;

  

2 按前10名出现的次数给男演员分配颜色
#找到各期前10名的男演员名字
period  = sorted(list(star_man.period_num.drop_duplicates().values))  #找出所有期数
all_data = []  #构造存放所有数据的空列表
for i in period:data = star_man[star_man.period_num==i]  #取出某一期的数据data1 = data.iloc[0:9,:]  #取改期数据的前10名信息all_data.append(data1)    #把取出的信息存放到列表中
all_data_1 = concat(all_data)  #把列表中存放的数据框连接成一个数据框
#统计出现次数
all_data_1.name.value_counts()

代码解析:

period: 找出所有期数去重,并按从小到大排序;

all_data: 构造存放所有数据的空列表;

for: 构造循环取出每期前10名的信息;

all_data_1: 用concat函数把列表中存放的数据框连接成一个数据框(列表中不仅能存单个元素还可以存数据框);

value_counts(): 统计男演员在前10名中出现的次数;

:颜色分配是绘制动态条形图的关键,本文按照在前10名中出现次数分配颜色,出现次数越多,给的颜色越深,标注颜色并无其它含义。

得到结果:

3 绘制单个条形图
# 图形设置
plt.rcParams['figure.figsize'] = (12, 50)     # 图像显示大小
plt.rcParams['font.sans-serif'] = ['SimHei']  # 防止中文标签乱码,还有通过导入字体文件的方法
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['lines.linewidth'] = 0.8         # 设置曲线线条宽度
​
#绘制单个人的图形
person_num = 10  #绘制person_num个人的条形图
data = star_man[star_man.period_num==538]  #取某一期(538)的数据
data1 = data.iloc[0:person_num,:].sort_values(by = 'popularity_value', ascending = True) #取person_num个人的数据绘制条形图
name_color = pd.read_csv("name_color1.csv",encoding = 'gbk')        #控制每个人绘图的颜色
colors_0 = pd.merge(data1, name_color, how = 'left',  on = 'name')  #控制当前这一期的颜色
colors_1 = list(colors_0.color.values)                              #取出对应的颜色
plt.barh(data1.name, data1.popularity_value, height=0.5, color=colors_1, alpha=1)  #从下往上画
plt.xlim(min(data1.popularity_value),max(data1.popularity_value)*1.05)  #设置x轴的范围
plt.xlabel("人气值")  #给x轴加说明
title = '第'+str(int(data1.period_num[1]))+'期娱乐圈男星排行榜'  #构造图片标题
plt.title(title, fontsize=18)  #给条形图添加标题
plt.annotate(str(int(data1.end_time[1])), xy=(max(data1.popularity_value)*0.88, 1), xytext=(max(data1.popularity_value)*0.9, 1),color="r",weight="bold",\arrowprops=dict(arrowstyle='-',connectionstyle='arc3',color='red'),bbox=dict(boxstyle='round,pad=0.5', fc='yellow', ec='k',lw=1 ,alpha=0.4),\fontsize=15)  #添加数据截止统计日期
for x, y in enumerate(data1.popularity_value):  #添加名字plt.text(y + 10, x - 0.1 , '%s' % colors_0.name[x],fontweight='heavy')
plt.show()

代码解析:

plt.rcParams: 设置图形的参数;

person_num: 确定每期绘制的人数;

data: 取出538期排行榜的数据;

data1: 取出前person_num个人的信息,并按人气值排序;

name_color: 读取根据前10名出现次数分配的颜色;

colors_0: 根据分配的颜色,给出当前期绘制颜色;

plt.barh: 绘制横向条形图;

plt.xlim: 设置x轴的范围;

plt.annotate:添加图形右下角截止统计日期,其中str是添加的文字内容,xy是箭头的位置,xytext是文字的位置,bbox是添加边框;

for x, y:添加人名;

得到结果:

图2 娱乐圈男明星第538期排行榜条形图

数据来源:123粉丝网

  

三、绘制动态条形图整合代码

import matplotlib.pyplot as plt
import matplotlib
import numpy as np
import pandas as pd
from pandas import concat
import os
​
os.chdir(r"F:\微信公众号\Python\21.娱乐圈排行榜\2.绘制动图条形图")                   # 修改当前程序操作的路径
star_man = pd.read_csv("star_man.csv")
star_man = star_man.iloc[1:,:]
period  = sorted(list(star_man.period_num.drop_duplicates().values))
#找到各期前15名的男演员名字
all_data = []
for i in period:data = star_man[star_man.period_num==i]data1 = data.iloc[0:14,:]all_data.append(data1)
all_data_1 = concat(all_data)
# 图形设置
plt.rcParams['figure.figsize'] = (12, 50)     # 图像显示大小
plt.rcParams['font.sans-serif'] = ['SimHei']  # 防止中文标签乱码,还有通过导入字体文件的方法
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['lines.linewidth'] = 0.8         # 设置曲线线条宽度
for i in period:person_num = 10              #绘制person_num+1个人的图像data = star_man[star_man.period_num==i]    #取某一期的数据data1 = data.iloc[0:person_num,:].sort_values(by = 'popularity_value', ascending = True) #取person_num+1个人的数据绘制条形图name_color = pd.read_csv("name_color1.csv",encoding = 'gbk')        #控制每个人绘图的颜色colors_0 = pd.merge(data1, name_color, how = 'left',  on = 'name')  #控制当前这一期的颜色colors_1 = list(colors_0.color.values)                              #取出对应的颜色plt.clf()  # 清除之前画的图plt.barh(data1.name, data1.popularity_value, height=0.5, color=colors_1, alpha=1)      #从下往上画plt.xlim(min(data1.popularity_value),max(data1.popularity_value)*1.05)plt.xlabel("人气值")title = '第'+str(int(max(data1.period_num)))+'期娱乐圈男星排行榜'plt.title(title, fontsize=18)plt.annotate(str(int(max(data1.end_time))), xy=(max(data1.popularity_value)*0.88, 1), xytext=(max(data1.popularity_value)*0.9, 1),color="r",weight="bold",\arrowprops=dict(arrowstyle='-',connectionstyle='arc3',color='red'),bbox=dict(boxstyle='round,pad=0.5', fc='yellow', ec='k',lw=1 ,alpha=0.4),\fontsize=15)for x, y in enumerate(data1.popularity_value):  #添加名字plt.text(y + 10, x - 0.1 , '%s' % colors_0.name[x],fontweight='heavy')plt.pause(0.4)     # 设置暂停时间,太快图表无法正常显示
plt.ioff()    # 关闭画图的窗口,即关闭交互模式
plt.show()    # 显示图片,防止闪退

代码解析:

plt.clf():清除之前画的图,避免在一张图上画两个图;

plt.pause:每隔0.4秒展示一张图。

   注: 该代码只是在绘制单个条形图代码的基础上,用循环把所有图每隔一个很短的时间展示出来,给人一种动图的效果。

  本文是本人使用matplotlib库进行绘图得到的结果,如有问题请指正。若想获取文中所有可直接执行的代码和数据,可在公众号中回复"娱乐圈排行榜条形图",即可免费获取。如对代码有疑问,可以到公众号中私信我。

你可能感兴趣:
孤立森林
风控建模整体流程
爬娱乐圈排行榜数据
用Python绘制皮卡丘
用Python绘制词云图
Python入门干货经验(免费提供资料)
用Python绘制杨紫作品集动态二维码
【Python】【爬虫】Requests库详解

长按(扫一扫)识别上方二维码学习更多Python和建模知识

【Python绘图】Python画动态条形图(横向直方图)相关推荐

  1. python 画蜘蛛_R绘图 vs Python绘图(散点图、折线图、直方图、条形图、箱线图、饼图、热力图、蜘蛛图)...

    写在前面:为啥不用excel绘制这些图,用PoweBI,帆软BI等可视化软件来绘图,不是更方便吗?的确,这些工具都很方便,但同时,它们显得很呆,不够灵活,更为致命的是,它们绘制出的图形,分辨率不够,用 ...

  2. R绘图 vs Python绘图(散点图、折线图、直方图、条形图、箱线图、饼图、热力图、蜘蛛图)

    写在前面:为啥不用excel绘制这些图,用PoweBI,帆软BI等可视化软件来绘图,不是更方便吗?的确,这些工具都很方便,但同时,它们显得很呆,不够灵活,更为致命的是,它们绘制出的图形,分辨率不够,用 ...

  3. 数据可视化实验:python数据可视化-柱状图,条形图,直方图,饼图,棒图,散点图,气泡图,雷达图,箱线图,折线图

    数据可视化实验:python数据可视化 实验8-12:大数据可视化工具-python 目录 1柱状图 2条形图 3直方图 4饼图 5棒图 6散点图 7气泡图 8雷达图 9箱线图 10折线图 1柱状图 ...

  4. python 绘图如何画螺旋圈_如何画出python螺旋线

    如何画出python螺旋线 发布时间:2020-07-10 10:46:07 来源:亿速云 阅读:131 作者:Leah 今天就跟大家聊聊有关如何画出python螺旋线,可能很多人都不太了解,为了让大 ...

  5. 用Python优雅地制作动态条形图

    公众号"算法美食屋"后台回复关键字:动态图,可添加作者微信获取完整代码和人口数据集. 先上图片: 再上视频: 最后上代码: import numpy as np import pa ...

  6. python画动态图代码-Python使用matplotlib画动态图

    import numpy as np import matplotlib.pyplot as plt import math from scipy.interpolate import make_in ...

  7. python画动态图-Python使用matplotlib画动态图

    import numpy as np import matplotlib.pyplot as plt import math from scipy.interpolate import make_in ...

  8. 【Python基础】刷爆网络的动态条形图,3行Python代码就能搞定

    上次出了一个在网站「Flourish」画动态条形图的文章[动态条形图视频教程],需要登录网址很多人可能觉得不方便,现在有大佬出了个Python包,只需几行代码就能搞定动态条形图,非常强大,给大家分享下 ...

  9. 刷爆网络的动态条形图,3行Python代码就能搞定

    作者:小伍哥 来源:AI入门学习 上次出了一个在网站「Flourish」画动态条形图的文章[动态条形图视频教程],需要登录网址很多人可能觉得不方便,现在有大佬出了个Python包,只需几行代码就能搞定 ...

最新文章

  1. OPenfire简介
  2. SpringBoot运行异常时捕获
  3. python语言是一种高级通用编程语言-2019年十大顶级编程语言:会这些的程序员薪资有多高?...
  4. Vue的常用指令(v-html {{}}文本插值,v-bind绑定属性,v-if条件渲染,v-for列表渲染,v-on @ 事件绑定,v-model表单绑定)
  5. 一次简单的sql性能比较
  6. centos 6.2 vnc
  7. 2057. 值相等的最小索引
  8. 采用python解决实际问题_Python编程语言解决几种常见的实际问题
  9. springmvc 优点_深入整合SSM框架引发底层原理——SpringMVC
  10. 百练6183-人民币支付-2014正式A题
  11. 《模拟电子技术基础》-(童诗白)笔记
  12. 软考计算机硬件知识,软考程序员考点计算机硬件基础知识之指令系统
  13. 2023年天津仁爱学院专升本动画专业报考专业限制范围目录
  14. proftpd java_基于 proftpd 配置加密 FTP
  15. 计算机16进制A3 B9,ASCII码16进制对照表
  16. AI+智能服务机器人应用基础【学习报告】
  17. 《鸟哥的Linux私房菜 基础学习篇(第三版)》习题与解析(一)
  18. 【单片机毕业设计】【mcuclub-106】智能晾衣架 | 多功能晾衣架【实物设计】
  19. 新标准大学英语综合教程2(第二版)unit1答案截图
  20. 天宇电梯卡数据分析延期教程 电梯卡延期校验计算工具

热门文章

  1. PMP证书容易考吗?
  2. 作也 努力努力在努力
  3. SAP S4 HANA 本地化报表配置(科目余额表/资产负债表/利润表/会计凭证明细表)
  4. c#简单几步实现圆角按钮
  5. Android-茫茫9个月求职路,终于拿满意offer
  6. zz from 古文中惊艳的句子
  7. vue 跳转页面删除当前tab
  8. nginx安装、nginx前端配置、后端配置、前后端分离配置、https支持(ssl配置)、负载均衡配置、nginx location详解
  9. VMware安装VMwareTolls
  10. BatchNorm的通俗解释