注:
运行过程中,如果发现某个包未安装,可以新建单元格,输入以下内容,然后重启环境即可。
相关数据已部署在实操平台上,就在本实验文件相同目录下。可以直接通过数据名称获取。
Echarts 是一个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而 Python 是一门富有表达力的语言,很适合用于数据处理。当数据分析遇上数据可视化时,pyecharts 诞生了。
注:pyecharts.org 官网不做版本管理,所看到的当前文档为最新版文档,若文档与您使用的版本出现不一致情况,请及时更新 pyecharts。
可用以下代码查看当前版本。
import pyecharts
print(pyecharts.__version__)
安装方式:
如果安装速度慢,可以考虑换源安装
版本更新
同理,速度慢的话可以考虑换源更新
全局配置项可通过 set_global_options 方法设置
from pyecharts.charts import Bar,Map #图表对象导入
from pyecharts import options as opts #配置项
import pandas as pd
import re
import random
bar = Bar()
bar.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
bar.add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
bar.add_yaxis("商家B", [10, 20, 36, 10, 75, 90])
bar.set_series_opts(
label_opts=opts.LabelOpts(is_show=True),
)
bar.set_global_opts(
title_opts=opts.TitleOpts(title="商品售卖情况"),toolbox_opts=opts.ToolboxOpts()
)
# render 会生成本地 HTML 文件,默认会在当前目录生成 render.html 文件
# 也可以传入路径参数,如 bar.render("mycharts.html")
# bar.render()
bar.render_notebook() # 直接在notebook上呈现图表
使用链式调用的方式生成图形
c = (
Bar()
.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
.add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
.add_yaxis("商家B", [10, 20, 36, 10, 75, 90])
.set_series_opts(
label_opts=opts.LabelOpts(is_show=True),
)
.set_global_opts(
title_opts=opts.TitleOpts(title="商品售卖情况"),toolbox_opts=opts.ToolboxOpts()
)
)
c.render_notebook()
import pyecharts.options as opts
from pyecharts.charts import Scatter
data = [
[10.0, 8.04],
[8.0, 6.95],
[13.0, 7.58],
[9.0, 8.81],
[11.0, 8.33],
[14.0, 9.96],
[6.0, 7.24],
[4.0, 4.26],
[12.0, 10.84],
[7.0, 4.82],
[5.0, 5.68],
]
# data.sort(key=lambda x: x[0])
x_data = [d[0] for d in data]
y_data = [d[1] for d in data]
c = (
Scatter()
.add_xaxis(xaxis_data=x_data)
.add_yaxis(
series_name="1",
y_axis=y_data,
color='yellow',
symbol_size=20,
)
.add_yaxis(
series_name="2",
y_axis=y_data,
color='red',
symbol_size=20,
)
.set_global_opts(
xaxis_opts=opts.AxisOpts(
type_="value", splitline_opts=opts.SplitLineOpts(is_show=True)
),
yaxis_opts=opts.AxisOpts(
type_="value",
axistick_opts=opts.AxisTickOpts(is_show=True),
splitline_opts=opts.SplitLineOpts(is_show=True),
),
)
)
c.render_notebook()
灵活运用视觉映射配置项 visualmap
from pyecharts import options as opts
from pyecharts.charts import Scatter
from pyecharts.faker import Faker # 利用Faker内置的数据进行实验,输入 help(Faker) 即可了解详情。
c = (
Scatter()
.add_xaxis(Faker.choose())
.add_yaxis("商家A", Faker.values())
.add_yaxis("商家B", Faker.values())
.set_global_opts(
title_opts=opts.TitleOpts(title="Scatter-VisualMap(Size)"),
visualmap_opts=opts.VisualMapOpts(type_="size", max_=150, min_=20),
)
)
c.render_notebook()
from pyecharts.charts import Line
c = (
Line()
.add_xaxis(Faker.choose())
.add_yaxis('line1',Faker.values())
.add_yaxis('line2',Faker.values())
.set_global_opts(
title_opts=opts.TitleOpts(title='折线图')
)
)
c.render_notebook()
import random
from pyecharts.charts import Bar3D
data = [(i, j, random.randint(0, 12)) for i in range(6) for j in range(24)]
data
c = (
Bar3D()
.add(
"",
[[d[1], d[0], d[2]] for d in data],
xaxis3d_opts=opts.Axis3DOpts(Faker.clock, type_="category"),
yaxis3d_opts=opts.Axis3DOpts(Faker.week_en, type_="category"),
zaxis3d_opts=opts.Axis3DOpts(type_="value"),
)
.set_global_opts(
visualmap_opts=opts.VisualMapOpts(max_=20),
title_opts=opts.TitleOpts(title="3D图形示例"),
)
)
c.render_notebook()
df = pd.read_csv('data.csv')
df
attr = [re.sub('省|市|自治区|维吾尔|壮族|回族','',x) for x in list(df['provinceName'])]
value = df['province_confirmedCount']
sequence = list(zip(attr,value))
def map_visualmap(sequence,year) -> Map:
c = (
Map()
.add(year,sequence, "china",)
.set_global_opts(
title_opts=opts.TitleOpts(title="全国疫情确诊情况"),
visualmap_opts=opts.VisualMapOpts(max_=80000,
is_piecewise=True,
pieces=[{'min':1,'max':9},
{'min':10,'max':99},
{'min':100,'max':499},
{'min':500,'max':999},
{'min':1000,'max':10000},
{'min':10000,'color':'red'}])
)
)
return c
c = map_visualmap(sequence,'全国疫情确诊情况')
c.render_notebook()
利用词语共现挖掘关键词之间的关系
df2 = pd.read_csv('data2.csv')
df2.head()
import jieba # 这个包用来进行分词
import numpy as np
定义绘制图谱的函数
此函数用于获取图谱节点数据,返回图谱节点信息
def get_nodes(items):
texts = [] # 存放所有切割好的字段
for item in items:
temp = [ x for x in jieba.cut(item,cut_all=True) if len(x)>1 and not_num(x)]
texts+=temp
mset = set(texts)
keys = []
values = []
stop_list = ['研究'] # 停用词表
for item in mset:
if texts.count(item) > 5 and item not in stop_list: # 达到一定阈值,去停用词
keys.append(item)
values.append(texts.count(item))
return zip(keys,values)
此函数用于获取节点之间的联系信息
def get_links(key1,key2,items):
'''两节点之间的连线数量'''
counts = 0
# print('{} {} {}'.format(key1,key2,items))
for item in items:
if key1 in item and key2 in item:
counts = counts + 1
return counts
此函数用于绘制图谱
def draw_graph(items,datas):
'''绘制知识图谱'''
def link_color_map(x): #
if x < 5:
return '#DAA520'
if x < 10:
return '#40E0D0'
if x < 15:
return '#FFD700'
else:
return '#FF7F50'
def node_color_map(x):
if x < 5:
return '#000000'
if x < 10:
return '#00FFFF'
if x < 15:
return '#4169E1'
if x < 20:
return '#F08080'
if x < 25:
return '#FFFF00'
if x < 30:
return '#00FF00'
if x < 35:
return '#FF00FF'
return '#FF1493'
nodes_data = [{'name':x[0],'symbolSize':x[1],'itemStyle' :{'normal':{'color':node_color_map(x[1])}}} for x in datas]
#nodes_data = [opts.GraphNode(name=x[0],symbol_size=x[1],item_style =opts.ItemStyleOpts(color=node_color_map(x[1]))) for x in datas]
keys = []
for x in datas:
keys.append(x[0])
links_data = []
for i in range(len(keys)-1):
for j in range(i+1,len(keys)):
thecount = get_links(keys[i],keys[j],items)
if thecount == 0:
continue
links_data.append(opts.GraphLink(source=keys[i],target=keys[j],linestyle_opts = opts.LineStyleOpts(curve=0.3,width=thecount*0.2,color=link_color_map(thecount))))
c = (
Graph()
.add(
'',
nodes_data,
links_data,
repulsion=4000,
)
)
return c
标题数据清洗
# 过滤标题中的数字
def not_num(x):
try:
x = int(x)
except:
return True
return False
数据集中包含 上海财经大学、中央财经大学、中南财经政法大学、西南财经大学、北京大学、清华大学 六个院校数据。
可以代入到下方代码中查看该院校相关情况。
from pyecharts.charts import Graph
temp_df = df2[df2['工作单位']=='上海财经大学']
node_value = get_nodes(temp_df['项目名称'])
map = draw_graph(temp_df['项目名称'],list(node_value))
map.render_notebook() #图形渲染可能需要一段时间,请耐心等待