专栏首页Python与算法之美超实用,百行Python代码制作动态树地图

超实用,百行Python代码制作动态树地图

今日表情?

树地图(tree map)是一种适用于显示大量分层结构的数据,它是饼状图的一种高维度替代者,可以用面积直观显示各个部分的占比。

先上图片:

再上视频:

最后上代码:

import numpy as np 
import pandas as pd 
from matplotlib import pyplot as plt
import matplotlib.animation as  animation 

import imageio
import os 
import cv2
from PIL import Image
import squarify


cmap = [
'#2E91E5',
'#1CA71C',
'#DA16FF',
'#B68100',
'#EB663B',
'#00A08B',
'#FC0080',
'#6C7C32',
'#862A16',
'#620042',
'#DA60CA',
'#0D2A63']*100

plt.rcParams['animation.writer'] = 'html'
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

def html_to_gif(html_file, gif_file, duration=0.1):
    path = html_file.replace(".html","_frames")
    images = [os.path.join(path,x) for x in sorted(os.listdir(path))]
    frames = [imageio.imread(x) for x in images]
    imageio.mimsave(gif_file, frames, 'gif', duration=duration)
    return gif_file


df = pd.read_csv('./data/gdp_china_1993_2019.csv')
df["date"] = [str(x) for x in df["date"]]
df = df.set_index("date")
df.columns = [x if "自治区" not in x else x[0:2] for x in df.columns]
df = df.sort_values("2019",axis = 1,ascending=False)

figsize = (8,6)
dpi = 160
title = "中国大陆各省份历年GDP"
n_visible = 31 

def treemap_dance(df,filename = None,
    title = "中国大陆各省份历年GDP",figsize = (8,6),dpi = 120,duration = 2,n_visible= 31):
    
    assert filename is None or filename.endswith(".html"), "filename should like *.html!"
    
    fig,ax = plt.subplots(figsize=figsize,dpi=dpi)
    

    # 调整spines
    ax.spines["top"].set_visible(False)
    ax.spines["right"].set_visible(False)
    ax.spines["left"].set_visible(False)
    ax.spines["bottom"].set_visible(False)

    def plot_frame(i):
        
        ax.clear() 
        date = df.index[i]
        dfdata = pd.DataFrame(df.loc[date,:])
        dfdata.columns = ["values"]
        dfdata["color"] = [cmap[i] for i in range(len(dfdata))] 
        dfdata = dfdata.sort_values("values",ascending = True) 

        dfused = dfdata.iloc[n_visible::-1,:] 
        xdata = dfused.index.tolist()
        ydata = dfused["values"].tolist()
        colors = dfused["color"].tolist()

        #plt.rc('font', size=7,color = "white")
        squarify.plot(sizes = ydata, # 指定绘图数据
             label = xdata, # 指定标签
             color = colors, # 指定自定义颜色
             alpha = 0.5, # 指定透明度
             value = ydata, # 添加数值标签
             edgecolor = 'white', # 设置边界框为白色
             linewidth =3, # 设置边框宽度为3
             ax = ax,
             text_kwargs = {"size":8,"color":"black"},
             zorder = 0
        )

        #辅助设置
        ax.set_title(title,color = "black",fontsize = 12)
        ax.text(0.08, 0.92, str(date), va="center", ha="center",
                alpha=1.0, color ="white", size = 20,transform = ax.transAxes)
        plt.axis('off')
        plt.tick_params(top = 'off', right = 'off')
        

    my_animation = animation.FuncAnimation(fig,plot_frame,frames = range(0,len(df)),interval = int(duration*1000))
    if filename is None:
        try:
            from IPython.display import HTML
            HTML(my_animation.to_jshtml())
            return HTML(my_animation.to_jshtml())
        except ImportError:
            pass
    else:
        my_animation.save(filename)
        return filename

treemap_dance(df)

html_file = "treemap_dance.html"
gif_file = "treemap_dance.gif"
treemap_dance(df, filename = html_file)

html_to_gif(html_file,gif_file,duration=1.0)

主要原理是安装并使用了squarify 库来绘制树地图,并借助 matplotlib中的 animation制作动态图。

收工。?

本文分享自微信公众号 - Python与算法之美(Python_Ai_Road),作者:梁云1991

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-06-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 超动感,百行Python代码制作动态气泡图

    主要思路是构建plot_frame函数逐帧绘制图像,再用matplotlib的animation模块制作动画。

    lyhue1991
  • 超酷炫,百行Python代码制作动态曲线图

    主要思路是设计plot_frame绘图函数绘制逐桢图片,然后用matplotlib.animation构建动画,如果有需要,还可以导出成gif和mp4。

    lyhue1991
  • 超简单,百行Python代码制作动态条形图跳舞

    打码不易,不想被白嫖,有需要完整代码和GDP数据集的同学,可以对本文点赞,在看,和分享后在公众号“算法美食屋”后台回复关键字:动态图,添加作者微信获取。感谢支持...

    lyhue1991
  • 一行代码制作你的专属动态二维码-Python实现

    K同学啊
  • 用Python制作动态二维码,真的只需要一行代码!

    今天在最大的同性交友社区GitHub上发现了一个比较有意思的项目,无论你是什么操作系统,只需要一行代码就可以很方便的生成二维码。包括普通二维码、艺术二维码(黑白...

    龙哥
  • 「Python爬虫系列讲解」七、基于数据库存储的 BeautifulSoup 招聘爬取

    前文回顾: 「Python爬虫系列讲解」一、网络数据爬取概述 「Python爬虫系列讲解」二、Python知识初学 「Python爬虫系列讲解」三、正则表达...

    荣仔_最靓的仔
  • 如何利用树莓派打造一款机器人

    作者/刘端阳,清华大学aminer.org研究者社交网络系统的R&D,参与过智谷睿拓公司(已经被小米收购)的专利挖掘,在大数据征信领域创业过,出过一本叫做《树莓...

    刘盼
  • 这里有 300 篇 Python 与机器学习类原创笔记

    主要包括计算机科学中基本的算法与数据结构,结合算法思想和Leetcode实战,总结介绍。

    好好学java
  • 超好用的谷歌浏览器、Sublime Text、Phpstorm、油猴插件合集

    一、谷歌浏览器插件 二、Sublime Text 插件 三、Phpstorm 插件 四、油猴脚本 4.1 脚本网站 4.2 自用的脚本 五、相关链接 ? 分享...

    guanguans
  • 首次成功用CNN自动生成代码:北大研究者搞定了炉石传说

    北大研究者最近提出了使用卷积神经网络(CNN)解码器生成代码的方法,并在《炉石传说》数据集上进行了测试,效果超过了此前各类业内最佳模型。该研究的论文已被 AAA...

    机器之心
  • 用树莓派做一个人脸识别开锁应用

    ? 作者:eckygao,腾讯 CSIG 云产品部 1.案例概述 1.1 背景 实现一个人脸识别进行开锁的功能,用在他的真人实景游戏业务中。总的来说,需求...

    腾讯技术工程官方号
  • 200行代码落地人脸识别开锁应用

    2019年国庆,帮朋友实现了一个人脸识别进行开锁的功能,用在他的真人实景游戏业务中。几个月来运行稳定,体验良好,借着这个春节宅家的时间,整理一下这个应用的实现过...

    高树磊
  • 基于树莓派以及语音与人脸识别的迎宾机器人交互系统开发计划(已完结github中)

    作品未来设想:并不是制作一个能自由行走的智能管家机器人之类的,那样的科技以及成本是不一个寒假可以ko!我们希望创造出智能机器人的头。

    我在鹅厂做安全
  • 「Python爬虫系列讲解」八、Selenium 技术

    前文回顾: 「Python爬虫系列讲解」一、网络数据爬取概述 「Python爬虫系列讲解」二、Python知识初学 「Python爬虫系列讲解」三、正则表达式...

    荣仔_最靓的仔
  • 杨超越第一,Python第二

    近日百度贴吧吧主在杨超越吧发帖,呼吁要为自己的偶像组织第一届杨超越杯编程大赛,众粉丝呼应,随即上了微博热搜,传遍全网,让网友惊呼这年头不会编程,都不好意思当杨超...

    AI科技大本营
  • Python知识点

    宇宙之一粟
  • 树莓派人脸识别门禁系统图文教程

    前面发布了人脸识别门禁系统的系列视频教程,现在补上图文版,方便查看指令和代码,这篇文章也是对之前的文章的更新与完善。

    小雨编程
  • 树莓派综合项目2:智能小车(四)超声波避障

    树莓派综合项目2:智能小车(二)tkinter图形界面控制,实现了本地图形界面控制小车的前进后退、转向和原地转圈。

    张国平
  • 「Python爬虫系列讲解」九、用 Selenium 爬取在线百科知识

    前文回顾: 「Python爬虫系列讲解」一、网络数据爬取概述 「Python爬虫系列讲解」二、Python知识初学 「Python爬虫系列讲解」三、正则表达式...

    荣仔_最靓的仔

扫码关注云+社区

领取腾讯云代金券