• 登录
Skip to content

一起大数据-技术文章心得

一起大数据网由数据爱好者发起并维护,专注数据分析、挖掘、大数据相关领域的技术分享、交流。不定期组织爱好者聚会,期待通过跨行业的交流和碰撞,更好的推进各领域数据的价值落地。

Menu
  • 首页
  • 大数据案例
  • 数据&电子书
  • 视频
    • Excel视频
    • VBA视频
    • Mysql视频
    • 统计学视频
    • SPSS视频
    • R视频
    • SAS视频
    • Python视频
    • 数据挖掘视频
    • 龙星计划-数据挖掘
    • 大数据视频
    • Machine Learning with Python
  • 理论
    • 统计学
    • 数据分析
    • 机器学习
    • 大数据
  • 软件
    • Excel
    • Modeler
    • Python
    • R
    • SAS
    • SPSS
    • SQL
    • PostgreSQL
    • KNIME
  • 技术教程
    • SQL教程
    • SPSS简明教程
    • SAS教程
    • The Little SAS Book
    • SAS EG教程
    • R语言教程
    • Python3教程
    • IT 技术速查手册
    • Data Mining With Python and R
    • SAS Enterprise Miner
  • 问答社区
  • 我要提问
Menu

python绘制动态可视化图

Posted on 2021年11月1日
今天要做的是一个动态图表,起因是在一个ted演讲上面,看到了统计学家Hans Rosling的一篇演讲,觉得挺有意思的,就拿来数据自己实验一下
https://www.bilibili.com/video/av36510825
视频中的展示链接:https://www.gapminder.org/tools/#$chart-type=bubbles
这里使用matplotlib高仿一版,看看效果。纵轴liftspan人均寿命,横轴income(人均收入),点代表国家,不同颜色表示地区,气泡大小表示人口数量。
拆分省份,最后一年展示下省份之间的差距实现方式是通过python中的绘图模块matplotlib中的animation模块实现,实现原理就是循环创建图片,然后按帧合成为动画,当然,最后不一定能100%实现,来做个高仿版本的。这篇文章既是实现该目标的过程,也是对python中的matplotlib库做个复习。

一、准备数据源

首先是找到相关的数据源,这里数据源来自于展示链接中,我这里直接存储在百度网盘中,链接在最下面,需要的可以点击获取,第一步是将数据导入其中

# 导入用到的python模块
import pandas as pd
import json 
import numpy as np
# 读取表格中的收入数据到2018年
df_income = pd.read_csv(r'D:\Jupyter Notebook\33 可视化\data\income_per_person_gdppercapita_ppp_inflation_adjusted.csv'
                        ,encoding='utf-8').iloc[:,0:220]
# 读取表格中的寿命数据
df_lifespan = pd.read_csv(r'D:\Jupyter Notebook\33 可视化\data\life_expectancy_years.csv',encoding='utf-8').iloc[:,0:225]

# 读取表格中的人口数据到2018年
df_population = pd.read_csv(r'D:\Jupyter Notebook\33 可视化\data\population_total.csv',encoding='utf-8').iloc[:,0:220]

# 读取json文件中的国家与州的数据
df_relation = pd.read_json(r'D:\Jupyter Notebook\33 可视化\data\country_continent.json',encoding='utf-8')

最后读取的数据内容如下图:

数据内容

二、合并数据源为指定的格式

需要将数据源合并成类似的格式,这样方便生成后续图表。

指定数据格式
# 使用pandas的merge函数合并
df_tmp = pd.merge(df_income,df_lifespan,how='inner',on='country',suffixes=('_income', '_lifespan'))
df_tmp2 = pd.merge(df_population,df_tmp,how='inner',on='country') #此时左右列没有重叠,故suffixes字段无效
df = pd.merge(df_relation,df_tmp2,how='inner',left_on='country_name',right_on='country')
df.head()
合并结果

值得注意的是,这里在合并population的过程中并没有将相关的数据加上后缀,因为合并时候的字段并不一致,这就导致population的数据是没有”-population”的后缀的,如果有强迫症的自己重命名一下列。

三、生成基础matplotlib图形格式

这里需要使用matplotlib模块生成我们要做的基本格式,这里偷个懒,把以前我经常用的格式直接导入进来。

# 导入基础的matplotlib配置
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker 
import matplotlib.animation as animation
large = 22; med = 16; small = 12 #其余字体大小统一设置为14
params = {'axes.titlesize': large,
          'legend.fontsize': med,
          'figure.figsize': (15, 8),
          'axes.labelsize': med,
          'axes.titlesize': med,
          'xtick.labelsize': med,
          'ytick.labelsize': med,
          'figure.titlesize': large}
plt.rcParams.update(params)
plt.style.use('seaborn-whitegrid') #更改模块风格
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签 plt.rcParam
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
# plt.rcParams['savefig.dpi'] = 300 #保存图片像素
plt.rcParams['animation.embed_limit' ] = 100 #限定animation的生成
# 导入百度echart的一组颜色卡
r_hex = '#dc2624'     # red,       RGB = 220,38,36
dt_hex = '#2b4750'    # dark teal, RGB = 43,71,80
tl_hex = '#45a0a2'    # teal,      RGB = 69,160,162
r1_hex = '#e87a59'    # red,       RGB = 232,122,89
tl1_hex = '#7dcaa9'   # teal,      RGB = 125,202,169
g_hex = '#649E7D'     # green,     RGB = 100,158,125
o_hex = '#dc8018'     # orange,    RGB = 220,128,24
tn_hex = '#C89F91'    # tan,       RGB = 200,159,145
g50_hex = '#6c6d6c'   # grey-50,   RGB = 108,109,108
bg_hex = '#4f6268'    # blue grey, RGB = 79,98,104
g25_hex = '#c7cccf'   # grey-25,   RGB = 199,204,207
色卡

接下来就是绘制的重点,animation的绘制方式就是不断渲染图片,所以,我们需要自定义一个数据的生成过程。这里要注意两点,第一是创建该函数的时候不能创建画布,只能保留绘制过程,画布的创建应该在animation里面创建;第二是由于x轴incom的分布并不是均匀的,越到后面数据相差越大,为了不影响美观性,这里需要对x轴进行标尺变换,即x轴的坐标是[500,1000,2000,4000,8000,16000,32000,64000],是翻倍类型的坐标轴,如果采用原坐标轴的话势必会导致数据分布的不均匀,故,这里采用matplotlib中标尺变换功能,将x轴进行变换,我们并没有更改数据的值,只是改变了显示方式。请务必在 xscale 之后指定 xticks,因为该函数具有内置的刻度设置。

#绘制基础画布
# fig, ax = plt.subplots(figsize=(15, 8))

def draw(year):    
    ax.clear()
    year=year
    income = str(year)+'_income'
    lifespan = str(year)+'_lifespan'
    population = str(year)
    tmps = df[[income,lifespan,population]]

    #增加画布的标题
    fig.suptitle('人均收入与寿命之间的关系',color=dt_hex)

    #在图片中插入文本,设定对齐方式
    plt.text(7000, 45, year ,fontsize=300,color=bg_hex,alpha=0.25,horizontalalignment='center',verticalalignment='center')

    # x轴设定为income,y轴设定为liftspan,
    plt.xlabel('人均收入',fontsize=20,color=dt_hex)
    plt.ylabel('预期寿命',fontsize=20,color=dt_hex)

    #进行x轴标尺转换,这一步要放在xticks之前,因为该函数具有内置的刻度设置
    plt.xscale('log')

    #插入图表
    plt.scatter(x=tmps[income],y=tmps[lifespan],s=tmps[str(year)]/100000,alpha=0.6)

    #设定x轴、y轴的坐标尺寸
    plt.xticks([500,1000,2000,4000,8000,16000,32000,64000,128000],['500','1000','2000','4000','8000','16k','32k','64k','128k'],alpha=0.6)
    plt.yticks(list(range(0,100,10)),alpha=0.6)
    
    #plt.show()

接下来就是重点了,调用matplotlib的animation方法生成动态图表,并调用html方法展示出来

import matplotlib.animation as animation
from IPython.display import HTML
fig, ax = plt.subplots(figsize=(15, 8))
animator = animation.FuncAnimation(fig, draw, frames=range(1800, 2019))
HTML(animator.to_jshtml()) 
动态可视化图表

最后,导出生成的动态可视化图表为gif

animator.save('save.gif',writer='imagemagick') 
# windows需要安装imagemagick软件,并配置到系统路径中

遗留的问题:

  1. 展示界面太丑,并且缺失了洲维度数据的展示
  2. 没有对主要的国家进行注释
  3. 最后导出的gif图片无法播放,不清楚是什么原因

相关数据链接:
链接: https://pan.baidu.com/s/1uwODubkzCUujvSnu2gTE5A 提取码: n89s

推荐访问


数据分析交流:数据分析交流
Excel学习: Excel学习交流
Python交流:一起学习Python(数据分
SQL交流:一起学习SQL(数据分析
微博:一起大数据

最新提问

  • SQL Chat
  • sql server 不允许保存更改。您所做的更改要求删除并重新创建以下表。您对无法重新创建的表进行了更改或者启用了”阻止保存要求重新创建表的更改”选项。
  • 偏相关分析
  • 复相关系数
  • 【R语言】熵权法确定权重
  • 如何破解Excel VBA密码
  • 解决 vba 报错:要在64位系统上使用,请检查并更新Declare 语句
  • 基于 HuggingFace Transformer 的统一综合自然语言处理库
  • sqlserver分区表索引
  • Navicat连接数据库后不显示库、表、数据

文章标签

ARIMA CBC Excel GBDT KNN Modeler Mysql pandas PostgreSQL python python数据可视化 R SAS sklearn SPSS SQL SVM Tableau TensorFlow VBA 主成分分析 关联规则 决策树 协同过滤 可视化 因子分析 大数据 大数据分析 推荐系统 数据分析 数据可视化 数据挖掘 数据透视表 文本挖掘 时间序列 机器学习 深度学习 神经网络 结构方程 统计学 联合分析 聚类 聚类分析 逻辑回归 随机森林
©2023 一起大数据-技术文章心得 | Design: Newspaperly WordPress Theme