可视化课程的两个小作业:
- 使用 echarts 生成一个与个人有关的词云图
- 使用 echarts 建立关于个人时空数据的图表
Pyecharts是一个 echarts的 Python包装,社区也提供了其他多种语言的绑定,因为本身是一个基于配置的图表库,所以使用什么语言大同小异,最终都是用 echarts.js 渲染到网页上。
目录结构:
说明:
spacetime
为作业2,wordcloud
为作业1
建议使用python -m venv venv
在Pyecharts-examples
下建立虚拟环境,然后使用pip install requirements.txt
安装依赖。
./venv/Scripts/activate
激活虚拟环境后即可正常使用
代码放在CSDN的 GitLab :pyecharts 可直接访问
词云图
数据来源:申请wb开发者,建立新应用后获取APP_KEY
,APP_SECRET
就可以访问官方接口获取数据,但是能用的接口很受限,也很少,数据获取也有限制,比如这里只能获取150条我个人的主页数据。
简单地使用接口的代码放在仓库里了,仅供参考,感谢owolf
改写的 sinaweibo3
- 直接把保存wb的json文件当成文本处理,只保留汉字和空格
with open('./150weibos.json',mode='r',encoding='utf-8') as f:
weibos = f.read()
pat = re.compile("[^\u4e00-\u9fa5]")
weibos = pat.sub('', weibos)
- 使用
Paddlenlp
对文本进行分词,并统计词频存到字典里待后续处理
seg = Taskflow('word_segmentation')
words = seg(weibos)
word_counts = dict(Counter(words))
word_counts = [(k,v) for k,v in word_counts.items()]
- 配置式创建图表并渲染到 html
def wordClound():
wc = (
WordCloud(
init_opts=opts.InitOpts(
theme=ThemeType.LIGHT,
width='95vw',
height='95vh',
renderer=RenderType.SVG,
page_title='个人微博主页内容分析',
)
).add(series_name="个人微博主页内容分析",
data_pair=word_counts,
word_size_range=[20, 150],
word_gap='100',
rotate_step=45,
pos_left='center',
pos_top='center'
)
.set_global_opts(
tooltip_opts=opts.TooltipOpts(is_show=True),
)
.render('./wordcloud.html')
)
return wc
- 使用
selenium
进行图片导出 (可选)
是因为想要导出图片,但是文档里说还需要安装另一个依赖,当时环境里就有selenium
,所以直接使用截图功能保存了图片
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
import time
chrome_options = webdriver.ChromeOptions()
# chrome_options.add_argument("--headless=new")
driver = webdriver.Chrome(
service=ChromeService(ChromeDriverManager().install()),
options=chrome_options
)
import os
DESKTOPPATH = os.environ['USERPROFILE']
OUTDIR = 'file:///'+DESKTOPPATH+'/Desktop/visualization/wordcloud/'
driver.get(OUTDIR+'wordcloud.html')
driver.maximize_window()
driver.refresh()
driver.save_screenshot('./wordcloud.png')
driver.close()
效果:
时空数据图表
数据来源:使用一款叫phyphox
的物理实验APP收集的GPS定位数据,可以直接导出csv,仓库里有例子,应该不属于什么敏感数据,缺点是不能后台,得一直开着收集。个人感觉比较符合所谓的 时空数据 的定义,有时间戳,有空间特征。
然后就是分析这些数据绘制一些图表。
- 使用 pandas 分析 csv 列出需要绘制的数据项
data = pd.read_csv('./hiking/walkdata.csv')
data.head(3)
data.describe()
%%
xyz = data[['Latitude (°)', 'Longitude (°)',
'Altitude WGS84 (m)']].to_numpy().tolist()
x2y = data[['Latitude (°)', 'Longitude (°)']].to_numpy().T
x2y[0] = x2y[0] * 1000 - 26060
x2y[1] = x2y[1] * 10000 - 1191900
x2y = x2y.tolist()
z2time = data[['Time (s)', 'Altitude WGS84 (m)']].to_numpy().T.tolist()
speed2time = data[['Time (s)', 'Speed (m/s)']].to_numpy().T.tolist()
distance2time = data[['Time (s)', 'Distance (km)']].to_numpy().T.tolist()
satellites2time = data[['Time (s)', 'Satellites']].to_numpy().T.tolist()
from collections import Counter
satellites2count = Counter(satellites2time[1])
satellites2count = [[k, v] for k, v in satellites2count.items()]
satellites2count = sorted(satellites2count, key=lambda x: x[1], reverse=True)
- 使用
Pyecharts
渲染并按一定布局放置到 html上
from pyecharts.globals import ThemeType, RenderType
page = Page(
layout=Page.SimplePageLayout,
page_title="时空数据可视化",
)
page.add(xyzplot(), x2yplot(), z2timeplot(), speed2timeplot(),
distance2timeplot(), satellites2timeplot())
page.render("./spacetime.html")
效果:
注意:
仓库中的数据都已被删除,其中150weibos.json
也可以使用任意文本文件替代
walkdata.csv
只能是phyphox导出的定位数据集