from pyecharts import Radar
import webbrowser,os,json
colors=["red","darkblue","lightblue","orange","darkgreen","darkgoldenrod"]
with open("soldiers.json", encoding="utf-8") as f:#文件包含中文,要解码,用到格式encoding="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"))
雷达图确实需要注意的点很多,而且创建背景模板和添加数据的这段代码似乎并不是那么容易想到。不过其实一点也不难,只要了解他是由几部分构成的,再一部分一部分的构建就好了。我这里按照创建顺序而不是程序运行顺序介绍,这样更好理解。
部分一:主程序。他需要添加一个背景版来支撑数据的呈现。他还需要一组或更多的数据加入。在这里,模板是schema_1(参看下段代码,揣摩理解)。
在chart.add()中的第一个参数,list(cont.keys())[j]遍历以dict_字典中所有键组成的列表的所有元素,代表要载入的图例名字。比如在这里它可以是:骑兵,剑士...我们就叫他们角色名吧。第二个参数是角色名对应的各项指标,比如骑士角色对应指标用程序把它打印出来就是:[[20,5,70,45,0.8]],表示近战20,远攻5,防御70等。一定要注意他是一个嵌套列表(因为雷达图为了玩法多种多样,让你能够输入一个角色对应的多种情况下不同的能力属性)。我们联系下图就能理解他代表什么。
另外,legend_pos和legend_orient分别代表图例在画面中的位置和图例是垂直于还是水平(可以使用horizontal)于页面。legend_pos 既可以是百分数,代表图例离左上角的距离比上整个页面的宽度,也可以是left或right,比较灵活。char.Radar()创建图表名字,显示在图表旁边。另外注意到chart.add()的最后一个参数line_color输入的是各组数据展现后的颜色。详细信息见下下图(运行结果)
部分二:参照下段代码的格式,写想要显示的数据和背景板,仔细观察以下模板中各个max键和对应单兵种作战性能数据值的关系,多尝试。
剩下的一部分就很简单了,就是通过json库导入导出字典和列表作为雷达图展示的数据和背景图。注:数据的储存方式不重要,我这次用了字典,大家也可以试试使用列表来储存数据,只是我觉得字典在这里是最舒服的储存方式。
代码这东西是越说会越复杂的,大家只要基础过关,多试几次发现规律,就自然而然地会了。
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)
以上是运行结果



