python用pyecharts画矩形树图实例
作者:林老头ss 发布时间:2022-12-20 21:42:04
一、概念介绍
矩形树图(Treemap),即矩形式树状结构图,利用矩形的面积表示数值的大小,颜色用于类别区分,常用于呈现多类别的一维数值比较,易读性强;基于树状的功能,在结构图中可以同时呈现数据层次的信息。
示例如下:
· 对比常见的柱状图和条形图,矩形树图弥补了以下三个缺点:
1、当我们的数据是多类别且每个类别只有一个数值时,我们用柱状图会浪费很多的空间,而且显得单调。
2、当数据间差异较大(235 vs 18),会是对我们柱状图的纵坐标设定带来困扰,忽略极差会稀释我们小值类的差异。(当然 ,如果我们的大值只有那么一两个,可以单拎出来处理)
3、柱状图无法呈现数据间的层级结构
二、数据展示
我们的目的是为了呈现类间数值大小差异,如果有第二层,也顺便比较第二层的占比情况。
为了展示多各类别,我们利用的是省份的数据,excel表格中呈现如下:
第二层、第三层为了树状的呈现而随机生成,也是为了说明,树层结构并不要求每个节点都有枝叶。
三、数据导入
我们先绘制只有一维的,只需要输入【省份】【关注类】两个列,这个其实更常用一点(我的角度)
province_type1 = pd.DataFrame(pd.read_excel('./各省市上市公司个数/矩形树图示例.xlsx'))
tree = []
name = [province_type1['省份'][i]+'\n'+str(province_type1['关注类A'][i]) for i in range(len(province_type1))]
for i in range(len(province_type1)):
dic = {}
dic["value"],dic["name"] = int(province_type1['关注类A'][i]),name[i]
tree.append(dic)
①name--列表型数据结构,用于存放每个数据的label,这里我为了同时呈现数据对应的省份和大小,中间用了换行符(不用的话,在我们的树图上是一行,不好看)
②绘制矩形树图需要的是list,list里面是字典,key名指定为"name","value"。
③一定要注意的是,如果你画出来的图没有数据或者没有显示,检查是不是读excel数据中出现了问题,即上述代码中int的位置。
用于绘制treemap的数据结构如下所示:
四、图像绘制
tm = (
TreeMap()
.add("关注类A",tree)
.set_series_opts(label_opts=opts.LabelOpts(position='inside'))
.set_global_opts(title_opts=opts.TitleOpts(title = '',subtitle = '2022/1/18-林老头ss'))
)
tm.render('./绘图结果/矩形树图-例一.html')
position---指定label,即我们的name的位置,inside会居中显示。如果不加,默认top,在每个矩形上方显示。
结果如下所示:
由上图可知,广东省、浙江省和江苏省在随机数据中排名前三。受显示区域的限制,数据较小或名字过长的矩形往往不能显示完全,需要交互式放大其数值。
五、树形结构
在加入树形结构后,我们需要在代码中相应增加key为“children"的数据
from pyecharts.charts import Page,TreeMap
from pyecharts import options as opts
import pandas as pd
import math
province_type1 = pd.DataFrame(pd.read_excel('./矩形树图示例.xlsx'))
tree = []
name = [province_type1['省份'][i]+'\n'+str(province_type1['关注类A'][i]) for i in range(len(province_type1))]
for i in range(len(province_type1)):
dic = {}
dic["value"],dic["name"] = int(province_type1['关注类A'][i]),name[i]
if math.isnan(province_type1['关注类A-1'][i]) ==0:
dic["children"] = [
{"name":province_type1['省份'][i]+"A-1:"+str(province_type1['关注类A-1'][i]),"value":int(province_type1['关注类A-1'][i])},
{"name":province_type1['省份'][i]+"A-2:"+str(province_type1['关注类A-1'][i]),"value":int(province_type1['关注类A-2'][i])}
]
if math.isnan(province_type1['关注类A1-1'][i]) ==0:
dic["children"][0]["children"] = [
{"name":"A1-1:"+str(province_type1['关注类A1-1'][i]),"value":int(province_type1['关注类A1-1'][i])},
{"name":"A1-2:"+str(province_type1['关注类A1-1'][i]),"value":int(province_type1['关注类A1-2'][i])}
]
tree.append(dic)
tm = (
TreeMap()
.add("关注类A的树",tree)
.set_series_opts(label_opts=opts.LabelOpts(position='inside'))
.set_global_opts(title_opts=opts.TitleOpts(title = '加油呀朋友们~',subtitle = '2022/1/18-林老头ss'))
)
tm.render('./绘图结果/矩形树图-例二.html')
如果没有枝叶的类,则不需要在"name""value"平级上加"children",如果枝叶中有两个以上类别,相当于是一个新的树,需要增加“children”,结构和树形一致,如下所示:
【“name”:“父节点”,
"value": number,
"children":【{“name”:“子节点一”,“value”:number},
{“name”:“子节点二”,“value”:number},
{“name”:“子节点三”,“value”:number}
】
】
子序列在显示区域允许的情况下,可以继续按上述结构增加。
绘制结果如下所示:
从上图我们可以看到,尽管我们为父类命名,但显示的结果只有最小类的名称和数值。
pyecharts图像交互性较强,可以通过点击不断聚焦类,放大图像,但由于不知道怎么呈现给大家,还是鼓励大家自己动手操作去探索叭~
来源:https://blog.csdn.net/qq_45400322/article/details/122560489
猜你喜欢
- 本文实例讲述了python中enumerate函数遍历元素用法。分享给大家供大家参考,具体如下:enumerate函数用于遍历序列中的元素以
- 读写文件是最常见的IO操作。Python内置了读写文件的函数,用法和C是兼容的。读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由
- 导语说到童年爱玩的电脑游戏,你会想到什么?最国民的莫过于金山打字通,接着是扫雷、红心大战,而红极一时的单机游戏当属《大富翁》。嘻嘻 打字游戏
- 公司做了个客户,需要图片生成像alibaba的效果。原来开发的系统都是用Aspjpeg进行缩小图的,现在需要处理图片,当然又想到这个组件。但
- 词频统计是指在文本中计算每个词出现的次数。在 Python 中,可以使用一些第三方库(如 jieba)来分词,然后使用字典等数据结构记录每个
- 经常会在连接DB的时候用到,就是不知道代表什么意思。。。RS.OPEN SQL,CONN,A,BA: ADOPENFORWARDONLY(=
- 【错误原因】:mysql_query执行超时.【解决办法】:修改php.ini中的 max_execution_time的值,默认为300,
- 在操作系统的文件中,还存在着一种我们可以自己定义的文件属性。这些属性不是保存在文件内容中,也不是直接可以通过 ls -al 所能看到的内容。
- 1、简介在python自动化中,我们传递一些参数是需要从文件中读取过来的,读取过来的字典并非python对象数据类型而是string类型。这
- 在最近的一次调试中,出现如下错误~·错误类型:ADODB.Recordset (0x800A0E7D)连接无法用于执行此操作。在此上下文中它
- 昨晚着手给个人博客增加网易微博的调用,在Opera下却出现了一个意想不到的问题。内容的展示,一开始是做成横向不间断滚动(现在已经改成纵向定时
- 另外他们列出的这些区别有些是蛮有意义的,有些可能由于他们本人的MySQL DBA的身份,对Oracle的理解有些偏差,有些则有凑数的嫌疑.
- 开篇先明义:lambda是表达式,而def函数是语句代码块所以lambda其实就是一个稍微高级一点的式子而已,只不过这个式子比较长,而且还会
- 1,建路由;2,写方法;def fanyi(request): import requests import jso
- 中间件Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。中间件的设
- 查看某一列中有多少中取值:数据集名.drop_duplicates(['列名'])#实际为删除重复项,删除后对原数据集不修改
- 我们现在使用的验证手段都是以验证码为主,让用户根据图片输入验证字符,这种方法的安全度尚可,但会给用户带来一些不便和困扰,比如这个雅虎的验证码
- 如何写入超长的字符串? 我们可使用Command写入,来完成大容量的字符串的操作: dim&n
- 最近几个不错网站被封,让人感觉很不爽,现在既不方便用,也不方便学习参考。正好想到曾经“截图”的事情,其实我认为互联网产品还有个特点,更新换代
- bookheader.asp Recommended Books for <%=session(&quo