娱乐圈排行榜动态条形图绘制

发布时间:2025-05-19 02:36

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。

原始发表:2020-04-05

,如有侵权请联系 [email protected] 删除

网址:娱乐圈排行榜动态条形图绘制 https://m.mxgxt.com/news/view/1273831

相关内容

2017年娱乐圈名人排行榜
娱乐圈男星排行榜前10名‌如下...@小余娱乐的动态
45万粉丝绘制明星地图
娱乐圈杂志排行榜前十名
明星娱乐小说排行榜起点
娱乐公司排行榜
百度排行榜明星榜:洞察娱乐圈风云变化
家谱图绘制软件
Origin软件教程:绘制三角形图(如何用origin画三角形图)
娱乐圈有钱人排行榜2020(娱乐圈富人榜)

随便看看