python数据可视化案例——⼒导向图,⽹络图,关系图(使⽤
pyecharts,netwo。。。
pyecharts⽆向关系图,⽹络图,⼒导向图,数据来源于2020美赛D题
import json
import os
from pyecharts import options as opts
from pyecharts.charts import Graph, Page
import numpy as np
import pandas as pd
dataset = pd.read_csv('passingevents.csv') #读取数据
data = dataset.values[:, :]
nodes=[]
links=[]
for line in data:
if int(line[0])==1 and line[2][0]=="H":
palyer={}
palyer["name"]=line[2]
palyer["symbolSize"]=10
if line[2][8]=='D':
color="#FF0000"
cat=0
elif line[2][8]=='F':
color="#3CB371"
cat=1
elif line[2][8]=='M':
color="#9400D3"
cat=2
else:
color="#00BFFF"
cat=3
# palyer["itemStyle"]={"normal": {"color": color}}
palyer["category"] = cat
if palyer not in nodes:
nodes.append(palyer)
palyer2={}
palyer2["name"]=line[3]
palyer2["symbolSize"]=10
if line[3][8]=='D':
color="#FF0000"
cat=0
elif line[3][8]=='F':
color="#3CB371"
cat=1
elif line[3][8]=='M':
color="#9400D3"
cat=2
else:
color="#00BFFF"
cat=3
# palyer2["itemStyle"]={"normal": {"color": color}}
palyer2["category"] = cat
if palyer2 not in nodes:
nodes.append(palyer2)
links.append({"source": line[2], "target": line[3]})
categories=[
{
"name": "防守"
},
{
"name": "前锋"
},
{
"name": "中场"
},
{
"name": "守门员"
}]
graph= (
Graph(init_opts=opts.InitOpts(width="1000px", height="800px"))
.add("",
nodes,
links,
categories=categories,
layout="force"
)
.set_global_opts(title_opts=opts.TitleOpts(title="传球⽹络图"))
)
python使⽤networkx
参考博客
# -*- coding: utf-8 -*-
lors import ListedColormap
import networkx as nx
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from collections import Counter
matchID=1 #第⼏场⽐赛
pass_nodes=[]
#经典三⾊'#4D85BD','#F7903D', '#59A95A'
#color_map=["#61A0A8","#D48265","#C23531","#2F4554"]
cmap=ListedColormap([ '#87CEEB','#FFD700', '#808000'])
#cmap=ListedColormap(color_map) #结点颜⾊
pass_ways_part=[]
path=r"passingevents.csv"
ad_csv(path)
time=0
begin_number=0
data["pass_ways_total"]=data["OriginPlayerID"]+","+data["DestinationPlayerID"]
#得到这场⽐赛是从[begin_number,number),共number次传球
for row in range(1,len(data.index)-1): #遍历每⼀⾏
if (data.loc[row][0]==matchID): #看⽐赛的matchID对不对
if(time==0):
time=1
begin_number=row
number=begin_number+1
else:
number=number+1
#遍历每⼀次传球
#for row in range(len(data.index)):
for row in range(begin_number,number):
if ((data.loc[row][0]==matchID)and(data.loc[row][1]=="Huskies")):
pass_nodes.append(data.loc[row][2]) #传球是从[row][2]传到[row][3]
pass_nodes.append(data.loc[row][3])
pass_ways_part.append(data.loc[row][11])
#计算每⼀种传球组合出现的次数
pass_ways_part=sorted(pass_ways_part)
pass_ways_part_dict=Counter(pass_ways_part) #Counter⽤的好返回字典形式#开始画图
pass_relation=[i.split(",") for i in pass_ways_part_dict.keys()]#列表⾥⾯是列表
pass_relation=[tuple(i) for i in pass_relation]#列表⾥⾯变为元组
#⾥⾯的数据长这样:
# pass_relation=[('Huskies_M5', 'Huskies_F2'),('Huskies_M5', 'Huskies_M4')]
pass_node=set(pass_nodes)
node_number=[]
for i in pass_node:
node_number.append(unt(i))#计算包含的点出现的次数node_number nodes_numbers=dict(zip(pass_node,node_number))#点和次数打包成字典
#⾥⾯的数据长这样:
#nodes_numbers={'Huskies_M5': 7, 'Huskies_G1': 24}
edgeWidth=[]#根据权重保存显得粗细
for i in pass_ways_part_dict.values():
edgeWidth.append(i)
plt.figure(figsize=(12, 8) , dpi=50)
G=nx.MultiGraph()
G.add_nodes_from(pass_node)#画点
G.add_edges_from(pass_relation)#画线G.edges()
D=dict(G.degree)
print("节点的度",D)
print("中⼼性",nx.degree_centrality(G))#中⼼性
pos = nx.spring_layout(G)
plt.subplot()
#node_colors=[]
##color_map=["#37a2da","#32c5e9","#67e0e3","#9fe6b8","#ffdb5c","#ff9f7f"]
#for n des():
# if n[8]=="D":
# node_colors.append(color_map[0])
# elif n[8]=="F":
# node_colors.append(color_map[1])
# elif n[8]=="F":
# node_colors.append(color_map[2])
# else:
# node_colors.append(color_map[3])
nx.draw(G,pos,nodelist=D.keys(),node_size=[v*100 for v in D.values()],node_color=range(des())),node_Paired,with_labels=True, edge_color= range(len(G.edges())),edge_cmap=cmap,width=edgeWidth,alpha=1,font_size=30)
plt.show()
也可以直接使⽤js画图
参考博客
<!DOCTYPE html>
<html lang="en">
<head>
<script type="text/javascript" src="./js/jquery.min.js"></script>
<script type="text/javascript" src="./js/echarts.min.js"></script>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="resourceShow" ></div>
<script>
// 基于准备好的dom,初始化echarts实例
var myChart = echarts.ElementById('resourceShow'));// 指定图表的配置项和数据
var option = {
//backgroundColor: '#000F1F',
tooltip: {//弹窗
/*trigger: 'item',
formatter: function(params) {
//根据值是否为空判断是点还是线段
if(!isEmpty(params.data.source)){//如果⿏标移动到线条
}else{//如果⿏标移动到点
if(pe == "zone"){
return params.data.name + ":<br>" + " " + "配置状态:启⽤";
}else if(pe == "cluster"){
return params.data.name + ":<br>" + " " + "配置状态:启⽤";
}else if(pe == "host"){
var msg = "";
msg += params.data.name + ":<br>" + " " + "配置状态:启⽤" + "<br>";
if(!isEmpty(tStatus)){
msg += " " + "连接状态:" + tStatus + "<br>";
}
if(!isEmpty(leName)){
msg += " " + "宿主⾓⾊:" + leName + "<br>";
}
msg += " " + "业务数量:" + params.data.businessCnt + "<br>";
if(!isEmpty(params.data.hostCpuCoreNum)){
msg += " " + "CPU核⼼数:" + params.data.hostCpuCoreNum + "核<br>";
}
if(!isEmpty(params.data.hostRamSize)){
msg += " " + "内存总容量:" + (params.data.hostRamSize/1024/1024).toFixed(2) + "GB<br>";
}
if(!isEmpty(params.data.hostRamUsedSize)){
msg += " " + "内存已⽤量:" + (params.data.hostRamUsedSize/1024/1024).toFixed(2) + "GB<br>";
}
if(!isEmpty(params.data.hostRamAvailableSize)){
msg += " " + "内存可⽤量:" + (params.data.hostRamAvailableSize/1024/1024).toFixed(2) + "GB<br>";
}
if(!isEmpty(params.data.hostRamUsed)){
msg += " " + "内存占⽤百分⽐:" + (params.data.hostRamUsed*100).toFixed(2) + "%<br>";
}
if(!isEmpty(params.data.hostDiskTotalCapacityKB)){
msg += " " + "磁盘总容量:" + (params.data.hostDiskTotalCapacityKB/1024/1024).toFixed(2) + "GB<br>";
}
if(!isEmpty(params.data.hostDiskUsedKB)){
msg += " " + "磁盘已⽤量:" + (params.data.hostDiskUsedKB/1024/1024).toFixed(2) + "GB<br>";
}
if(!isEmpty(params.data.hostDiskAvailableKB)){
msg += " " + "硬盘可⽤量:" + (params.data.hostDiskAvailableKB/1024/1024).toFixed(2) + "GB<br>";
}
if(!isEmpty(params.data.hostDiskUsed)){
msg += " " + "硬盘可⽤量:" + (params.data.hostDiskAvailableKB/1024/1024).toFixed(2) + "GB<br>";
}
if(!isEmpty(params.data.hostDiskUsed)){
msg += " " + "磁盘占⽤百分⽐:" + (params.data.hostDiskUsed*100).toFixed(2) + "%<br>";
}
return msg;
}else if(pe == "vm"){
var msg = "";
msg += params.data.name + ":<br>" + " " + "配置状态:启⽤" + "<br>";
if(!isEmpty(params.data.instanceName)){
msg += " " + "实例名称:" + params.data.instanceName + "<br>";
}
if(!isEmpty(params.datament)){
msg += " " + "说明:" + params.datament + "<br>";
}
if(!isEmpty(params.data.applicationName)){
msg += " " + "归属应⽤:" + params.data.applicationName + "<br>";
}
if(!isEmpty(params.data.vmCpuCoreNum)){
msg += " " + "CPU核⼼数:" + params.data.vmCpuCoreNum + "核<br>";
}
setoptionif(!isEmpty(params.data.vmRam)){
msg += " " + "内存⼤⼩:" + (params.data.vmRam/1024/1024).toFixed(2) + "GB<br>";
}
if(!isEmpty(params.data.vmTotalDiskCapacity)){
msg += " " + "磁盘总容量:" + (params.data.vmTotalDiskCapacity/1024/1024).toFixed(2) + "GB<br>";
}
if(!isEmpty(params.data.systemType)){
msg += " " + "系统:" + params.data.systemType + "<br>";
}
if(!isEmpty(params.data.state)){
msg += " " + "电源状态:" + params.data.state + "<br>";
}
return msg;
}
}
}*/
},
color:['#09022C',
'#040193',
'#073CFE',
'#0065C2'],
legend: { //=========⼩图标,圖表控件
show:true,
data: [{
name: '区域',
icon: 'diamond' //'circle', 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow'
//icon:'image://./images/icon1.png' //如果⽤图⽚img,格式为'image://+icon⽂件地址',其中image::后的//不能省略
},
{
name: '集',
icon: 'rect'
}, {
name: '宿主机',
icon: 'roundRect'
}, {
name: '云主机',
icon: 'circle'
}
]
},
series : [ {//图⽚配置
type : 'graph', //关系图
//name : "拓扑图", //系列名称,⽤于tooltip的显⽰,legend 的图例筛选,在 setOption 更新数据和配置项时⽤于指定对应的系列。
layout : 'force', //图的布局,类型为⼒导图,'circular' 采⽤环形布局,见⽰例 Les Miserables
legendHoverLink : true,//是否启⽤图例 hover(悬停) 时的联动⾼亮。
hoverAnimation : true,//是否开启⿏标悬停节点的显⽰动画
coordinateSystem : null,//坐标系可选
xAxisIndex : 0, //x轴坐标有多种坐标系轴坐标选项
yAxisIndex : 0, //y轴坐标
force: {
repulsion: 450,//相距距离
edgeLength: [150, 200],
layoutAnimation: true
},
/*force : { //⼒引导图基本配置
//initLayout: ,//⼒引导的初始化布局,默认使⽤xy轴的标点
repulsion : 200,//节点之间的斥⼒因⼦。⽀持数组表达斥⼒范围,值越⼤斥⼒越⼤。
gravity : 0.03,//节点受到的向中⼼的引⼒因⼦。该值越⼤节点越往中⼼点靠拢。
edgeLength :80,//边的两个节点之间的距离,这个距离也会受 repulsion。[10, 50] 。值越⼩则长度越长
layoutAnimation : true
//因为⼒引导布局会在多次迭代后才会稳定,这个参数决定是否显⽰布局的迭代动画,在浏览器端节点数据较多(>100)的时候不建议关闭,布局过程会造成浏览器假死。
},*/
roam : true,//是否开启⿏标缩放和平移漫游。默认不开启。如果只想要开启缩放或者平移,可以设置成 'scale' 或者 'move'。设置成 true 为都开启
nodeScaleRatio : 0.6,//⿏标漫游缩放时节点的相应缩放⽐例,当设为0时节点不随着⿏标的缩放⽽缩放
draggable : true,//节点是否可拖拽,只在使⽤⼒引导布局的时候有⽤。
focusNodeAdjacency : true,//是否在⿏标移到节点上的时候突出显⽰节点以及节点的边和邻接节点。
//symbol:'roundRect',//关系图节点标记的图形。ECharts 提供的标记类型包括 'circle'(圆形), 'rect'(矩形), 'roundRect'(圆⾓矩形), 'triangle'(三⾓形),
'diamond'(菱形), 'pin'(⼤头针), 'arrow'(箭头)也可以通过 'image://url' 设置为图⽚,其中 url 为图⽚的链接。'path:// 这种⽅式可以任意改变颜⾊并且抗锯齿//symbolSize:10 ,//也可以⽤数组分开表⽰宽和⾼,例如 [20, 10] 如果需要每个数据的图形⼤⼩不⼀样,可以设置为如下格式的回调函数:(value: Array|number, params: Object) => number|Array
//symbolRotate:,//关系图节点标记的旋转⾓度。注意在 markLine 中当 symbol 为 'arrow' 时会忽略 symbolRotate 强制设置为切线的⾓度。
//symbolOffset:[0,0],//关系图节点标记相对于原本位置的偏移。[0, '50%']
edgeSymbol : [ 'none', 'arrow' ],//边两端的标记类型,可以是⼀个数组分别指定两端,也可以是单个统⼀指定。默认不显⽰标记,常见的可以设置为箭头,如下:edgeSymbol: ['circle', 'arrow']
symbolSize: 50,//图形⼤⼩
edgeSymbolSize : 10,//边两端的标记⼤⼩,可以是⼀个数组分别指定两端,也可以是单个统⼀指定。
itemStyle : {//===============图形样式,有 normal 和 emphasis 两个状态。normal 是图形在默认状态下的样式;emphasis 是图形在⾼亮状态下的样式,⽐如在⿏标悬浮或者图例联动⾼亮时。
normal : { //默认样式
label : {
show : true
},
//borderType : 'solid', //图形描边类型,默认为实线,⽀持 'solid'(实线), 'dashed'(虚线), 'dotted'(点线)
。
//borderColor : 'rgba(255,215,0,0.4)', //设置图形边框为淡⾦⾊,透明度为0.4
//borderWidth : 2, //图形的描边线宽。为 0 时⽆描边。
// opacity : 1 // 图形透明度。⽀持从 0 到 1 的数字,为 0 时不绘制该图形。默认0.5
},
emphasis : {//⾼亮状态
}
},
lineStyle : { //==========关系边的公⽤线条样式。
normal : {
color : '#31354B',
width : '1',
type : 'solid', //线的类型 'solid'(实线)'dashed'(虚线)'dotted'(点线)
curveness : 0, //线条的曲线程度,从0到1
opacity : 1
// 图形透明度。⽀持从 0 到 1 的数字,为 0 时不绘制该图形。默认0.5
},
emphasis : {//⾼亮状态
}
},
label : { //=============图形上的⽂本标签
normal : {
show : true,//是否显⽰标签。
position : 'bottom',//标签的位置。['50%', '50%'] [x,y] 'inside'
textStyle : { //标签的字体样式
color : '#2D2F3B', //字体颜⾊
fontStyle : 'normal',//⽂字字体的风格 'normal'标准 'italic'斜体 'oblique' 倾斜
fontWeight : 'bolder',//'normal'标准'bold'粗的'bolder'更粗的'lighter'更细的或100 | 200 | 300 |
fontFamily : 'sans-serif', //⽂字的字体系列
fontSize : 12, //字体⼤⼩
}
},
emphasis : {//⾼亮状态
}
},
edgeLabel : {//==============线条的边缘标签
normal : {
show : false
},
emphasis : {//⾼亮状态
}
},
//别名为nodes name:影响图形标签显⽰,value:影响选中后值得显⽰,category:所在类⽬的index,symbol:类⽬节点标记图形,symbolSize:10图形⼤⼩
//label:标签样式。
//数据
data : [
{
"id":0,
"name":"f0120",
"category":0,
"symbol":"diamond",
"symbolSize":80,
"type":"zone",
"itemStyle":
{"normal":
{
"color":"#09022C"
}
}
},
{
"id":1,
"name":"私有云研发测试环境",
"category":1,
"symbol":"rect",
"symbolSize":50,
"type":"cluster",
"itemStyle":
{"normal":
{"color":"#040193"}
}
},
{"id":2,"name":"存储
01","category":2,"symbol":"roundRect","symbolSize":40,"type":"host","hostCpuCoreNum":4,"hostCpuUsed":0.34,"hostCpuLost":1.58,"hostRamSize":16417088, "hostRamUsedSize":6689704,"hostRamAvailableSize":9727384,"hostRamUsed":0.4075,"hostDiskTotalCapacityKB":2927493120,"hostDiskUsedKB":50399692,"ho stDiskAvailableKB":2877093428,"hostDiskUsed":0.0172,"roleName":"存储节点","businessCnt":0,"connectStatus":"在线","itemStyle":{"normal": {"color":"#073CFE"}}},{"id":3,"name":"存储
02","category":2,"symbol":"roundRect","symbolSize":40,"type":"host","hostCpuCoreNum":4,"hostCpuUsed":0.18,"hostCpuLost":3.57,"hostRamSize":16417088, "hostRamUsedSize":8065364,"hostRamAvailableSize":8351724,"hostRamUsed":0.4913,"hostDiskTotalCapacityKB":2927493120,"hostDiskUsedKB":6261212,"hos
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论