赞
踩
目录
雷达图可以将游戏角色的不同能力值对比可视化,不仅让我们好判断哪种英雄在什么方面比较强,应该在什么时候使用,该买不该买;也可以帮助完善游戏,使其图像化,提升用户体验。
- from pyecharts import Radar
- import webbrowser,os,json
-
- colors=["red","darkblue","lightblue","orange","darkgreen","darkgoldenrod"]
-
- #这一段做的仅仅是打开存放雷达图模板的json文件和存放想展示的各项指标的数据的json文件
- with open("soldiers.json", encoding="utf-8") as f:#文件包含中文,要解码,用到uft-8解码
- cont = json.load(f)#各项数据,结构一般为字典嵌套字典
-
- with open("sample.json",encoding="utf-8") as f1:
- st=json.load(f1)#雷达图生成的背景模板
- lst_data=[list(cont[key].values()) for key in cont]
-
-
- #main program
- chart=Radar("托斯帕国的兵种战力分析")#创建雷达图对象
- chart.config(c_schema=st)#添加背景模板,注意格式
-
- for j in range(len(cont)):#用循环添加多组数据,第一组为键,第二组为分析的对应数据
- chart.add(
- list(cont.keys())[j],#分析的对象名
- [lst_data[j]],#分析的对象属性及其数据
- legend_pos="80%",#图例靠右的程度
- legend_orient="veritcal",#图例的展示方向为垂直方向
- line_color=colors[j]#雷达图的线条颜色
- )
-
-
- chart.render()#渲染图表
- webbrowser.open("file://"+os.path.realpath("render.html"))#生成图表
雷达图确实需要注意的点很多,而且创建背景模板和添加数据的这段代码似乎并不是那么容易想到。不过其实一点也不难,只要了解他是由几个模块构成的,再逐个构建就好了。我们先讲主程序,然后再讲模板和角色与其各项指标的格式。
雷达图需要我们添加一个背景版来支撑数据的呈现。他还需要一组或更多的数据加入。这里我们导入模板的使用的是chart对象的config()方法。注意,模板在本程序里是schema_1(参看下一个部分的代码,揣摩理解)。
在chart.add()中的第一个参数,list(cont.keys())[j]遍历由dict_()全体键组成的列表中的所有元素,代表要载入的图例名字。比如在这里它可以是:骑兵,剑士...我们就叫他们角色名吧。第二个参数是角色名对应的各项指标,比如骑士角色对应指标用程序把它打印出来就是:[[20,5,70,45,0.8]],表示近战20,远攻5,防御70等。一定要注意他是一个嵌套列表。为什么呢?明明嵌套列表中就只有一个元素,为什么不直接表示成一个列表?我们联系下图就能理解他代表什么。
另外,legend_pos和legend_orient分别代表图例在画面中的位置,和图例是垂直于还是水平于页面。legend_pos 既可以是百分数(代表图例离左上角的距离比上整个页面的宽度)也可以是left或right,比较灵活。char.Radar()创建雷达图对象并初始化名字,显示在图表旁边。另外注意到chart的add()方法的最后一个参数line_color输入的是各组数据展现后的颜色。详细信息见下下图(运行结果)
2.模板和相应数据的编写和相关文件操作
参照下段代码的格式,仔细观察以下模板中各个max键和对应单兵种作战性能数据值的关系,多尝试。max表示的是这个属性的最大值。因为要保证雷达图是一个正多边形,因此最后呈现出来的雷达图各属性顶点距离max的长度其实是max值和属性值的比。比如近战这个属性的max是40,而防御的max是150,我们举弓箭手这个例子,他的近战是5,防御是30。那么最后表上呈现距离长的将是150/30 和40/20个pyecharts单位。这相当于增加了max小的属性的长度,因为本身雷达图表示的结果就很相对,就是一种比较。
另外我们注意看一下模板schema_1列表。列表的每一个字典元素的都将是雷达图的一个顶点,一个指标。也就是说schema_1中有多少个元素,雷达图就是正几边形。
剩下的一部分就很简单了,就是通过json库导入导出字典和列表作为雷达图展示的数据和背景图。我大致讲一下:json.dump(data,file)就是将data存入file中;json.load(file)就是把file中的数据加载出来,需要使用一个变量来接收该数据。代码这么抽象的东西是越说会越复杂的,大家只要基础过关,多试运行几次发现规律,就自然而然地会了。
- import json
- dict_={
- "骑兵": {"近战": 20, "远攻": 5, "防御": 70, "速度": 45, "攻击速度": 0.8},
- "剑士": {"近战": 12, "远攻": 1, "防御": 45, "速度": 12, "攻击速度": 1.4},
- "矛兵": {"近战": 18, "远攻": 4, "防御": 45, "速度": 12, "攻击速度": 0.8},
- "重装步兵": {"近战": 15, "远攻": 6, "防御": 90, "速度": 6, "攻击速度": 1.1},
- "巨人": {"近战": 30, "远攻": 0, "防御": 90, "速度": 5, "攻击速度": 0.6},
- "弓箭手": {"近战": 5, "远攻": 15, "防御": 30, "速度": 14, "攻击速度": 1.2}
- }
-
- schema_1 = [
- {"name": "近战", "max": 40},
- {"name": "远攻", "max": 40},
- {"name": "防御", "max": 150},
- {"name": "移动速度", "max": 50},
- {"name": "攻击速度", "max":2}
- ]
-
- with open("soldiers.json", "w") as f:
- json.dump(dict_,f)
-
- with open("sample.json","w") as f1:
- json.dump(schema_1,f1)
上图是运行结果
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。