-
《python应用实战 爬虫文本分析与可视化》笔记 上
2020-12-14 17:21:04本书将python、html、爬虫、数据抓取、文本分析和数据可视化等技术,从应用流程上结合起来。 千里之行,始于足下。 一起学习吧~第一章 初识python
- 安装python(3.9) anaconda(3)
在JupyterNotebook中选择python3,并执行代码。
在这里插入图片描述
第一次打开JupyterNotebook终端/命令行会生成一个URL,为带有令牌密钥提示。需要将包含这个令牌密钥在内的整个URL复制到浏览器地址中,然后才能打开一个JupyterNotebook。此步骤执行一次即可,无需再次执行。
- 字符串操作
books = 'The Kite Runner' 字符串的索引和切片 print(books) print(books[0]) print(books[1:5]) print(books[-3:-1]) 字符控制方法 books.upper——'THE KITE RUNNER' books.replace('Runner','Walking')——'The Kite Walking' books.split('')——['The','Kite','Runner'] books.replace('n','T',1)——'The Kite RunTner' 格式化 'The Kite %s' %('Runner')——'The Kite Runner' 'The Kite {}'.format(5)——'The kite 5' 'The Kite {1}{0}'.format('Runner',5) ——'The kite 5 Runner'
- 列表
info = ['The Kite Runner','长篇小说',226000] info.append('美籍阿富汗人') print(info) ——['The Kite Runner','长篇小说',226000,'美籍阿富汗人'] info.insert(2,'上海人民出版社') print(info) ——['The Kite Runner','长篇小说','上海人民出版社',226000,'美籍阿富汗人'] info.remove('长篇小说') print(info) ——['The Kite Runner','上海人民出版社',226000,'美籍阿富汗人']
- 处理数据
1.判断 if 2003 in info: print('这是一本2003年出版的书') else: info.insert(2,2003) print('已添加该书的出版时间:2003年') pass 2.循环 #遍历表中的内容 range以左闭右开方式取值 for i in range(0,10): print(i,end='') for novel in info: print(novel) 3.嵌套 for novel in info: if isinstance(novel,list): for novel_L1 in novel: print(novel_L1) else: print(novel) pass pass
- 函数 用关键字def定义
先使用,再调用,最后执行。 def area(): #再调用后执行 radius = 1.3 s1 = 3.14*radius**2 c1 = 2*3.14*radius print('半径为',radius,'厘米的圆面积为:',s1) print('半径为',radius,'厘米的圆周长为:',c1) area() #先使用
- 模块
1. import导入模块 import random print(random.randint(0,100)) 2. from...import导入模块 #from 模块名 import 函数名 from random import * print(randint(0,100)) 3. 利用as起别名 import random as rd print(rd.randint(0,100))
第二章 网页
-
准备 Chrome
-
网址:统一资源定位符URL,网页:页面,网站:由许多网页和其他资源(图片、视频等)组成
获取URL:右键—复制链接地址 -
HTML:创建网页的方块 HTML: html初识
单标签:<img>'
<input>
,双标签:<html></html>
<body></body>
标签属性:以属性值=“属性值(键值对)的形式出现;可以有多个属性,无先后关系”
<标签名称 属性1=“属性1” 属性2=“属性2”>元素内容</标签名称>
<img src = "flower.jpg">
-
CSS与class:网页装饰
元素选择器: 通过标签名选择元素。格式:选择器{声明(特性:特征值)}h1 { color : grey; text-align : center;}
id选择器:对于<p></p>
,可以直接通过标签名称来定位其样式。比如:<p id="my text">
,而CSS规则的叠加性会使得所有的<p>
标签都具有同样效果。
类选择器:标签相同的CSS类名设置相同的样式。比如:定义一个大盒子<div>
类,<div class='yellow-text'>
-
JavaScript和id:增加网页互动
<!DOCTYPE html> <html> <head> <title>Hello JavaScript</title> <script> function sayHello(){ document.getElementByid("Hello").innerHTML = "Hello JavaScript!"; } function turnRed(){ document.getElementByid("Hello").style = "color : red;"; } </script> //script中的代码就是JavaScript //使用document.getElementByid选择html元素 </head> <body> <h1 id="hello"></h1> <button onclick="sayHello()">Say hello</button> <button onclick="turnRed">Turn red</button> </body> //document.getElementByid方法中传递id的值 </html>
网页中会显示两个按钮。点击
"Say hello"
按钮会出现"Hello JavaScript!"
,点击"Turn red"
按钮文本颜色变红。- 网页分析工具 ChromeF12 谷歌开发者工具详解 -Network
打开chrome,F12直接打开"开发者工具",将鼠标移到不同网页元素,html代码会跳转变化,相反也可用。
7.HTTPget和post请求
get请求:单纯获取网站信息。
post请求:将用户输入数据返回给网站。例如输入用户名和密码,这些数据就通过post请求发送给网站。状态码 含义 200 请求成功,请求的内容会和响应一起返回给浏览器 304 请求的内容与上次一样,浏览器缓存中有该内容 404 请求的资源在网站服务器中不存在 500 网站服务器出现错误 浏览器端cookie和服务器端session
尘世风—浅谈cookie、session
比如:
①用户输入了自己的用户名和密码,通过http的post请求发送给网站的服务器;
②网站服务器收到请求后,会对用户名和密码进行验证。如果通过验证,就会给用户保存一个会话(session)表示用户已经登录成功,同时返回给浏览器请求设置200的响应码,并将正确登录的html代码放在http响应的消息体里。并且,网站在响应的头部增加了一个信息Set=Cookie:session=abc123xyz
,session=abc123xyz
是用户在网站上登录会话的一个标识;
③浏览器在收到登陆成功的http相应时,会发现响应头里有Set=Cookie
的信息,并且会把网站会话标识保存在浏览器的cookie中,cookie是保存在浏览器里的一个小文件。以后每次浏览器在访问网站时,都会在请求头部加上cookie,把session=abc123xyz
发送给网站,网站将这个字符串与自己保存的会话相比较,如果确认用户已经登录过,则直接相应登录后的网页。
④登录的会话会被网站设置有效期,或者用户主动清除了cookie,则网站会判定没有登录过。http交互过程
利用chrome打开网址https://tools.ietf.org/html/rfc2616 并按下F12网页有三个请求,一个文档,三个png图片。
单击第一个条目,会出现第一个条目信息的HTTP请求/相应信息窗口。
可以通过这几个按钮切换视图,查看不同信息。
Headers:指的是http请求/响应的头部。包含了General、Response Headers(响应头部)、Request Headers(请求头部)。
General是总结性的信息,通常包含http的请求行(Request-line)和http相应的状态行(Status-line)信息。比如请求的URL,http请求方法,响应状态码等。
Response Headers(响应头部)和Request Headers(请求头部)信息较多
User-Agent是http请求用来向服务器传递浏览器信息,由于不需要登录,因此没有cookie相关信息。
Preview:对条目进行预览,结果与浏览器窗口显示内容一致。但如果点击"rfc.png",预览结果则是图片。
Response:用来显示http响应的消息体,第一个条目请求的是网页,窗口显示的就是对应网页的html代码。
8. 以URL结束URL的简单格式:https://网站域名/路径
示例:https://movie.douban.com/top250?start=0&filter=
其中以?开头的?start=0&filter=是URL的参数参数名 参数值 start 0 filter 空 那么URL格式就变成https://网站域名/路径?参数1=参数值1&参数2=参数值2…
这两个参数的作用在界面中显示为:
参数1start的作用是不是显而易见呢?那么另一个参数filter,没有参数值,但却一直以filter=的形式存在在URL的参数中。如果去掉,页面显示效果和未去掉一样。这说明如果filter参数为空,不传递也是可以的。
不止是翻页功能,URL参数还能控制网页的其他内容。
第三章 数据抓取
- 工具准备
anaconda开发工具套件里的request库,可直接在Jupyter里使用。
可能出现的问题:python interpreter is in a conda environment, but the environment has not been activate解决方法- 代码使用requests库发送了一个http的get请求。
http的请求直接保存在http_response变量里。
- 代码发送post请求。
post请求使用requests.post()方法向网站发送数据,把一个python字典{‘hello’: ‘world’}赋值给post()方法。字典里的数据将会作为POST请求的消息体传递给httpbin.org/post这个URL,响应如下:
- Xpath和lxml.html
lxml是用来处理XML和HTML的python第三档工具库,通常我们会使用到里面的html工具,也就是lxml.html。
而在lxml.html库中有一个常用方法:lxml.html.fromstring(),这个方法会把我们通过requests库获取的HTML文本文件,转换成可以分析的HTML对象。
这个HTML对象,可以当作通过chrome的开发者选项F12来分析的网页,可以通过鼠标来定位元素。XML是eXtensible Markup Language(可标记扩展语言)的缩写,它可以用来查找HTML元素及属性,它与HTML在结构上非常接近。但在代码中,我们无法用鼠标定位元素,因此XPath方法就能派上用场。XPath表达式形如:
//*[@id="screening"]/div[2]/ul/li[7]/ul/li[1]
XPath使用实例:
根据下列html代码来获取元素<!DOCTYPE html> <html> <head> <title>XPath示例</title> </head> <body> <div class="fruit"> #<body>中第一个<div>元素 水果列表: #<div>大盒子里有1个<ul>列表 <ul> #<ul>列表里有3个<li>元素 <li id="apple">苹果</li> <li>香蕉</li> <li class="special">西瓜</li> </ul> </div> <div class="vehicle"> #<body>中第一个<div>元素 交通工具列表: #<div>大盒子里有1个<ul>列表 <ul> #<ul>列表里有3个<li>元素 <li>汽车</li> <li>火车</li> <li class="special">飞车</li> </ul> </div> </body> </html>
①选择所有
<div>
元素://div
②选择所有“水果列表”的
<div>
元素://div[@class="fruit"]
③选择所有“水果列表”的
<div>
元素下的<li>
元素://div[@class="fruit"]
./li
如果未加.
,代码会无视当前位置而选择所有的<li>
元素④选择“苹果”元素:
//li[@id="apple"]
在html中,id属性是唯一的⑤选择“交通工具列表”下,带有
class="special"
属性的交通工具://div[@class="vehicle"]/li[@class="special"]
⑥选择第一个
<div>
元素://div[1]
XPath的第一个元素是从1开始的,pythono从0开始⑦不使用
//
的方法:需要写出完整路径/html/body/div/ul/li
XPath会选择所有的6个<li>
元素XPath的表达式 功能 / 从当前html根目录中选择元素。如 /html/body/div
会选择html
目录下,body
元素中所有div
元素// 选择所有目录下的所有元素。如 //div
,会选择html目录中所有div
元素. 选择当前元素。如 .//li
,会选择当前元素下面的所有li
元素@ 选择html元素的属性。 //element[n] 选择所有element元素的第n个元素 //*[@attr=“abc”] 选择所有attr="abc"的任何元素 实战:利用lxml.html来进行XPath的实际应用
先将上面的代码保存成lxml.html文件,在python中运行代码。import lxml.html with open('xpath.html', 'r', encoding='utf-8') as f: # 通过lxml.html.fromstring()方法 # 将保存在xpath.html中的HTML代码转换成HTML对象 html = lxml.html.fromstring(f.read()) print('HTML对象: {}'.format(html)) print('\n实例一:选择所有的<div>元素(2个):') all_div = html.xpath('//div') print(all_div) print('\n实例二:选择“水果列表”的<div>元素(1个):') fruit_div = html.xpath('//div[@class="fruit"]') print(fruit_div) print('\n实例三:选择所有的<li>元素(6个):') all_li = html.xpath('//li') print(all_li) print('\n实例四:先选择“水果列表”<div>再选择下面的<li>') # 由于xpath()方法会返回一个列表,而且这个列表只有一个元素, # 所以使用序号0来选择列表中的元素 fruit_div = html.xpath('//div[@class="fruit"]')[0] # XPath使用"."表示从当前<div>开始选择 fruit_li = fruit_div.xpath('.//li') # XPath不使用"." wrong_fruit_li = fruit_div.xpath('//li') print('使用了"."的选择结果(3个):') print(fruit_li) print('未使用"."的选择结果(6个):') print(wrong_fruit_li) print('\n实例五:选择“苹果”元素(1个):') apple_li = html.xpath('//li[@id="apple"]') print(apple_li) print('\n实例六:选择“交通工具列表”下面带有“class="special"”属性的交通工具(1个):') # 这种方式就需要提供完整的嵌套路径,如/div/ul/li的上一级 vehicle_special_li = html.xpath('//div[@class="vehicle"]/ul/li[@class="special"]') print(vehicle_special_li) print('\n实例七:选择第一个<div>元素(1个):') first_div = html.xpath('//div[1]') print(first_div) print('\n实例八:选择所有带有class="special"的元素(2个):') special_li = html.xpath('//*[@class="special"]') print(special_li) print('\n实例九:不使用"//"的选择方式(6个):') full_path = html.xpath('/html/body/div/ul/li') print(full_path)
- robots.txt
Web Robot也称为网络机器人,通常是搜索引擎用来索引互联网内容的程序。爬虫也属于网络机器人的一类。
存在于网站域名下的robots.txt规定了网站的哪些内容可以被抓取,哪些内容不能被抓取。
robots.txt通常有User-Agent、Allow和Disallow几个关键字,User-Agent就是HTTP头部的User-Agent,Allow和Disallow后面通常指定了特定的URL前缀,表示允许或者禁止访问的页面。
一般在数据抓取之前,会查看域名下是否有robots.txt文件。通过浏览器打开域名/robots.txt
来检查协议内容,确定要抓去的数据是否被协议所允许。但是我们不能无限制抓取,避免给服务器造成过大压力。在需要限制程序抓取频率时,使用python中的time.sleep()实现。- 实例:抓取豆瓣电影(movie.douban.com)排名第一的电影标题
通过上面的操作抓取到的XPath(规范化后的HTML代码)://*[@id="billboard"]/div[2]/table/tbody/tr[1]/td[2]/a
在获取html文本后,利用lxml.html.fromstring()
将其转换成可以使用XPath分析的对象,并保存在变量html
中,再调用html.path()
,把前面从浏览器里获取的XPath作为xpath()参数传进来,这样就可以获取电影标题的元素了,这里的html.path()
方法返回值是数组类型。最后使用title[0].text_content()
来获取排名第一的电影标题。import requests import lxml.html # 获取豆瓣电影首页 http_response = requests.get('https://movie.douban.com', headers=myheaders) # 设置中文编码 http_response.encoding = 'utf-8' html = lxml.html.fromstring(http_response.text) # 通过xpath来获取排名第一个电影 title = html.xpath('//*[@id="billboard"]/div[2]/table/tr[1]/td[2]/a') print(title) print(title[0].text_content())
总结网页抓取步骤:
①获取html文本:通常使用requests
库实现,使用get或post方法发送http请求。有时会设置请求的头部,或者一些中文编码,以防止乱码出现
②转换html对象:使用lxml.html.fromstring()
将html代码转换成可以使用XPath分析的对象
③使用谷歌开发者工具获取元素的XPath:找到网页代码,copy XPath
④获取元素:使用lxml.html
的xpath()
方法获取元素,最后使用title.text_content()
方法获取文本6.1 抓取豆瓣电影(movie.douban.com)所有排名的电影标题
import requests import lxml.html # 获取豆瓣电影首页 http_response = requests.get('https://movie.douban.com', headers=myheaders) # 设置中文编码 http_response.encoding = 'utf-8' html = lxml.html.fromstring(http_response.text) # 通过xpath来获取所有电影 titles = html.xpath('//*[@id="billboard"]/div[2]/table/tr/td[2]/a') for title in titles: print(title.text_content())
- 另类网页的抓取
对于URL不固定的网页,比如会自动加载数据的网页豆瓣电影排行榜
中任选一个电影分类:惊悚片
获取到的XPath地址://*[@id="content"]/div/div[1]/div[6]/div
使用下面的代码获取电影元素
import requests import lxml.html http_response = requests.get('https://movie.douban.com/typerank?type_name=%E5%96%9C%E5%89%A7&type=24&interval_id=100:90&action=', headers=myheaders) http_response.encoding = 'utf-8' html = lxml.html.fromstring(http_response.text) movies = html.xpath('//*[@id="content"]/div/div[1]/div[6]/div') print(movies)
此时不会获取任何元素。这是因为我们在抓取静态页面时,我们将数据定义在JavaScript的变量里,通过这些数据增加表单的内容。而通过筛选http请求,其中有一个分类是XHR,通常用来加载JavaScript需要的数据。
通过不断下拉页面,左边网页增加内容时,右边的数据资源列表也会新增。用代码抓取网页没有数据的原因:因为这些数据是通过浏览器JavaScript代码之后加载数据重新生成的网页,而抓取网页的代码是没有运行JavaScript的功能的,所以只是抓取到了未运行JavaScript之前的html代码,因此也会有电影的数据了。看一下最后一条数据的XHR请求的资源:
网页中的XHR请求,通常会返回一个json数组,而json数组可以和python字典,通过json库进行转换。对于这种类型的网页,我们一般不使用
lxml.html
库。因为可以直接通过分析出来的URL获取数据。
复制网页URL:https://movie.douban.com/j/chart/top_list?type=24&interval_id=100%3A90&action=&start=40&limit=20
我们可以参照抓取多页数据的方法:import requests http_response = requests.get('https://movie.douban.com/j/chart/top_list?type=24&interval_id=100%3A90&action=&start=40&limit=20', headers=myheaders) # 直接读取返回的JSON数据 movie_data = http_response.json() print(type(movie_data)) for movie in movie_data: print(movie) print('----------------分隔----------------')
由于请求的URL相应是一个json数组,通过http_response的json()方法可以直接获取。代码中
print(type(movie_data))
直接打印movie_data的类型,可以确认http_response.json()方法把json数组转换成了python列表对象。for movie in movie_data: print(movie)
直接利用for循环把列表里的电影数据打印,每个电影数据都是一个python字典。上面抓取的网页有一个人特点,它通常是浏览器里下载的一些网页,然后再通过浏览器的一些事件,如用户鼠标滑动,发送一些XHR请求来获取服务器响应的数据。收到数据后利用JavaScript处理数据,将网页内容更新。对于动态的网页,通常直接通过抓取XHR请求的URL来直接完成。
- 安装python(3.9) anaconda(3)
-
⼤数据可视化技术:可视化技术概述与Echarts⼊⻔
2020-05-27 22:37:16数据可视化 是指将大型数据集中数据以图形图像形式表示 并利用数据分析和开发工具发现其中未知的信息处理过程。 数据可视化是指将数据以视觉的形式来呈现,如图表或地图,以帮助人们了解这些数据的意义。通过观察...Echarts2.0与3.0的区别
1 . 南丁格尔图设置, 2.0 roseType: ‘radius/area’; 3.0 roseType: ‘angle’,
2 . 拖拽重计算属性 , 2.0 calculable : true/false; 3.0 已经没有了
3 . ---------------------------------------------- 3.0 echarts小程序版本(没用过)
4 . 百度地图使用方式不同;
5 . 普通样式和鼠标放上去样式写法不同, 2.0 是 lable/itemStyle/lineStyle:{ normal: {普通样式},emphasis: {鼠标放上去样式}}
3.0 是单独有个属性emphasis:{鼠标放上去样式}
6 . 3.0可以再option:{}中设置 jquery的media,
media: [ // 这里定义了 media query 的逐条规则。
{
query: {…}, // 这里写规则。
option: { // 这里写此规则满足下的option。
legend: {…},
…
}
},
{
query: {…}, // 第二个规则。
option: { // 第二个规则对应的option。
legend: {…},
…
}
},
{ // 这条里没有写规则,表示『默认』,
option: { // 即所有规则都不满足时,采纳这个option。
legend: {…},
…
}
}
]
可以多个media 用法和jquery用法相同1.课程目标
数据可视化概念以及Echarts的基本用法
2.数据可视化概述
数据可视化主要指借助于图形化手段 清晰有效的传达与沟通信息
3.什么是数据可视化?
数据可视化 是指将大型数据集中数据以图形图像形式表示 并利用数据分析和开发工具发现其中未知的信息处理过程。 数据可视化是指将数据以视觉的形式来呈现,如图表或地图,以帮助人们了解这些数据的意义。通过观察数字、统计数据的转换以获得清晰的结论并不是一件容易的事。而人类大脑对视觉信息的处理优于对文本的处理——因此使用图表、图形和设计元素,数据可视化可以帮你更容易的解释数据模式、趋势、统计数据和数据相关性,而这些内容在其他呈现方式下可能难以被发现。
通俗的来讲就是让数据更直观的展示在页面上
4.经典可视化的案例
数据可视化商业案例集萃:http://www.storagelab.org.cn/zhangdi/2015/10/27/
五个历史上最有影响力的数据可视化信息图:https://www.ctocio.com/ccnews/16227.html
5.⼤数据可视化的价值
1.全方位数据解读数据可视化的过程中,企业可以根据数据的特点,360°全方位的将数据指标和维度进行组合,展现数据趋势。能够帮助企业各部门人员更深入的洞察工作中忽视的问题或者风险,将成功的经验引入分享并总结。
2.企业决策0失误企业决策人员通过分析和讨论数据结果能更快的发现数据的共同契合点,从仅有的数据中挖掘出潜在的商机,快速做出适合企业发展的有效决策。而不是通过以往自身对市场的走势判断来下决定。
3.为企业的每个工作人员提供辅助支持酷屏既可以为实施人员提供面向数据仓库的数据分析和丰富的二次开发接口,还可以为业务人员提供几十种能直接拖拉拽操作生成的大屏模板,也能让研发人员自由灵活的实现个性化功能拓展,实现组件样式或功能不受限。
4.展现企业实力企业在进行对外合作的时候,如果能用大屏展现企业现状和优势,能让合作方对企业的软硬件实力认知有很大提升,从而推进合作进程。
5.节约时间以往在进行每月,年中和年底总结的时候,各部门人员总是要花好几倍的时间去整理海量数据,然后用Excel将数据的某一个维度指标进行展示。当然不是说这种方法不好,但总归是麻烦了一些,而且很难从各个角度去分析,这样的总结分析动辄就是五六十页PPT,实在不利于领导理解工作。
6.数据可视化⼯具、案例、书籍
工具: Echarts、Sigma.js、Many Eyes等
书籍:数据可视化之美、数据可视化设计、视不可挡
7. Echarts概述
ECharts是百度开源的纯 Javascript 图表库,目前开源可以与highcharts相匹敌的一个图表库.支持折线图(区域图)、柱状图(条状图)、散点图(气泡图)、K线图、饼图(环形图)、雷达图(填充雷达图)、和弦图、力导向布局图、地图、仪表盘、漏斗图、事件河流图等12类图表,同时提供标题,详情气泡、图例、值域、数据区域、时间轴、工具箱等7个可交互组件,支持多图表、组件的联动和混搭展现。
8. Echarts特性介绍
ECharts,一个纯 Javascript 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari等),底层依赖轻量级的 Canvas 类库 ZRender,提供直观,生动,可交互,可高度个性化定制的数据可视化图表。ECharts 3 中更是加入了更多丰富的交互功能以及更多的可视化效果,并且对移动端做了深度的优化。
9. 如何快速上⼿开发⼀个Echarts可视化图表
管你使用那种 js 语言,要想实现功能,最核心的就是 下面的三个步骤。引入 Echarts 之前,要引入 jquery 库
1.引入 ECharts
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <!-- 引入 ECharts 文件 --> <script src="echarts.min.js"></script> </head> </html> 复制代码
2.准备容器
<body> <!-- 为 ECharts 准备一个具备大小(宽高)的 DOM --> <div id="main" style="width: 600px;height:400px;"></div> </body> 复制代码
3.绘制图表
通过 echarts.init 方法初始化一个 echarts 实例并通过 setOption 方法生成一个简单的柱状图,下面是完整代码。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>ECharts</title> <!-- 引入 echarts.js --> <script src="echarts.min.js"></script> </head> <body> <!-- 为ECharts准备一个具备大小(宽高)的Dom --> <div id="main" style="width: 600px;height:400px;"></div> <script type="text/javascript"> // 基于准备好的dom,初始化echarts实例 var myChart = echarts.init(document.getElementById('main')); // 指定图表的配置项和数据 var option = { title: { text: 'ECharts 入门示例' }, tooltip: {}, legend: { data:['销量'] }, xAxis: { data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"] }, yAxis: {}, series: [{ name: '销量', type: 'bar', data: [5, 20, 36, 10, 10, 20] }] }; // 使用刚指定的配置项和数据显示图表。 myChart.setOption(option); </script> </body> </html>
10. 如何阅读Echarts官⽅⽂档
进入echarts官网后 上面有个实例 进入官方实例
然后全局引入 之后就可以去找自己所需要的的条形图之类的实例了
11. Echarts学习必备基础知识
一、接口
echarts(enterprise charts 图标库)
二、图类
Bar:柱状图
line:折线图
Scatter:散点图
K:K线图
Pie:饼图
Radar:雷达图
Force:力导布局图
三、组件
Axis:坐标轴 Grid:网络 Polar:极坐标 Title:标题 Tooltip:提示 Legend:图例 data:值
四、基础库
zrender(canvas类库
12. Echarts3.x与Echarts2.x的区别
1、js文件:
首先是js文件,echarts3做了很大的优化,在echarts2中,对各种控件的类库管理的较为详细,有专门的目录结构来存放相关的js文件及相关资源,但是在引入文件的时候往往会很不方便,可能会一不小心就漏掉一个文件,而echarts3可以根据需要在下载项下直接根据所需的功能构架类库,使用时只要导入一个echarts.min.js文件就可以。2、文件导入:
在echarts2中,require是作为模块化加载的入口,在使用过程中关于路径配置经常会出现问题,特别是制作地图的时候,而在echarts3中只需要在开头加一句接下去只要调用接口就可以了。
3、离线地图:
echarts2中离线地图的精确度存在很大的问题,特别是下钻到区县一级,边界线存在模糊、交叉、空白等问题,并且经常出现飞地,与实际地图出入较大,个人认为基本没什么用,在echarts3中对此做了很大的改进,基本解决了以上问题,市与市之间、区县与区县之间基本上不存在衔接问题。另外,在echarts3中可以根据需要自主构建地图,这个服务给实际使用提供了很大的便利。
4、工具栏:
在echarts3的toolbox里面把辅助线功能取消掉了,图标变小了,总体上感觉echarts3里面的toolbox更丑了。5、地图漫游工具:
在echarts3里面把地图漫游工具取消掉了,说实话,echarts2里面的地图漫游工具看着还是挺不错的,虽然并没有什么用。6、坐标系:
echarts3中,数据结构进行了统一化抽象,最常用的数据结构有:线性表、树、图。例如,线性表以及树、图的节点列表的结构可以归一化为这样的二维数组:echarts3中另一个重要的数据结构抽象是独立出了“坐标系”概念。事实上在 ECharts 2 中已经有grid、polar配置项存在,但是并不是按一个“坐标系”的理解去实现的。echarts3中,支持了直角坐标系(catesian,兼容 echarts2中的grid)、极坐标系(polar)、地理坐标系(geo)。
7、Option变动:
1)组件位置想x、y等变成了left、top,可以使用像素和百分比,适应性更强。2)为了让结构更合理,echarts3中label被移出来和itemStyle平级。
根据官方说法,在echarts3中以前的用法也是兼容的,只是不推荐。
13. Echarts基础架构与常⻅名词术语
14. Echarts标准开发模板
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Echarts图表</title> <script src="../js/echarts.min.js"></script> </head> <body> <div id="main" style="width:600px;height:400px;"></div> </body> </html> <script> var myChart=echarts.init(document.getElementById('main')) var option={ legend:{ padding:10, itemGap:10,//图例间隔 data:['邓艳波','杨国娥']//legend的data值要和series的对象的每个name 值相对应,不然不出来lenend }, tooltip:{//悬浮的时候提示框 trigger:'item'//触发方式 }, xAxis:{ type:'category',//什么类型的,比如数值? data:['周一','周二','周三','周四','周五','周六','周日'] }, yAxis:{ type:'value', boundaryGap:[0.1,0.1],//类目起始和结束两端空白策略,见下图,默认为true留空,false则顶头 splitNumber:4,//数值的分割段数,不指定的时候根据最大值最小值进行划分 }, series:[ { name:'邓艳波',//系列名如启用legend,该值将被legend.data索引相关 type:'line',//折线图 data:[112,23,45,56,233,343,454,89,343,123,45,76] }, { name:'杨国娥',//系列名 type:'line',//折线图 data:[54,543,23,322,33,63,111,222,23] } ] } myChart.setOption(option) </script> 复制代码
15. Echarts 柱状图(bar)详解
mytextStyle={ color:"#333", //文字颜色 fontStyle:"normal", //italic斜体 oblique倾斜 fontWeight:"normal", //文字粗细bold bolder lighter 100 | 200 | 300 | 400... fontFamily:"sans-serif", //字体系列 fontSize:18, //字体大小 }; mylineStyle={ color:"#333", //颜色,'rgb(128, 128, 128)','rgba(128, 128, 128, 0.5)',支持线性渐变,径向渐变,纹理填充 shadowColor:"red", //阴影颜色 shadowOffsetX:0, //阴影水平方向上的偏移距离。 shadowOffsetY:0, //阴影垂直方向上的偏移距离 shadowBlur:10, //图形阴影的模糊大小。 type:"solid", //坐标轴线线的类型,solid,dashed,dotted width:1, //坐标轴线线宽 opacity:1, //图形透明度。支持从 0 到 1 的数字,为 0 时不绘制该图形 }; myareaStyle={ color:['rgba(250,250,250,0.3)','rgba(200,200,200,0.3)'],//分隔区域颜色。分隔区域会按数组中颜色的顺序依次循环设置颜色。默认是一个深浅的间隔色。 shadowColor:"red", //阴影颜色 shadowOffsetX:0, //阴影水平方向上的偏移距离。 shadowOffsetY:0, //阴影垂直方向上的偏移距离 shadowBlur:10, //图形阴影的模糊大小。 opacity:1, //图形透明度。支持从 0 到 1 的数字,为 0 时不绘制该图形 }; myitemStyle={ color:"red", //颜色 borderColor:"#000", //边框颜色 borderWidth:0, //柱条的描边宽度,默认不描边。 borderType:"solid", //柱条的描边类型,默认为实线,支持 'dashed', 'dotted'。 barBorderRadius:0, //柱形边框圆角半径,单位px,支持传入数组分别指定柱形4个圆角半径。 shadowBlur:10, //图形阴影的模糊大小。 shadowColor:"#000", //阴影颜色 shadowOffsetX:0, //阴影水平方向上的偏移距离。 shadowOffsetY:0, //阴影垂直方向上的偏移距离。 opacity:1, //图形透明度。支持从 0 到 1 的数字,为 0 时不绘制该图形。 }; mylabel={ show:false, //是否显示标签。 position:"inside", //标签的位置。// 绝对的像素值[10, 10],// 相对的百分比['50%', '50%'].'top','left','right','bottom','inside','insideLeft','insideRight','insideTop','insideBottom','insideTopLeft','insideBottomLeft','insideTopRight','insideBottomRight' offset:[30, 40], //是否对文字进行偏移。默认不偏移。例如:[30, 40] 表示文字在横向上偏移 30,纵向上偏移 40。 formatter:'{b}: {c}', //标签内容格式器。模板变量有 {a}、{b}、{c},分别表示系列名,数据名,数据值。 textStyle:mytextStyle }; mypoint={ symbol:"pin", //图形 'circle', 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow' symbolSize:50, //标记的大小,可以设置成诸如 10 这样单一的数字,也可以用数组分开表示宽和高,例如 [20, 10] 表示标记宽为20,高为10。 symbolRotate:0, //标记的旋转角度。注意在 markLine 中当 symbol 为 'arrow' 时会忽略 symbolRotate 强制设置为切线的角度。 symbolOffset:[0,0], //标记相对于原本位置的偏移。默认情况下,标记会居中置放在数据对应的位置 silent:false, //图形是否不响应和触发鼠标事件,默认为 false,即响应和触发鼠标事件。 label:{ normal:mylabel, emphasis:mylabel }, itemStyle:{ normal:myitemStyle, emphasis:myitemStyle } }; myline={ symbol:["pin","circle"], //图形 'circle', 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow' symbolSize:50, //标记的大小,可以设置成诸如 10 这样单一的数字,也可以用数组分开表示宽和高,例如 [20, 10] 表示标记宽为20,高为10。 precision:2, //标线数值的精度,在显示平均值线的时候有用。 silent:false, //图形是否不响应和触发鼠标事件,默认为 false,即响应和触发鼠标事件。 label:{ normal:mylabel, emphasis:mylabel }, lineStyle:{ normal:mylineStyle, emphasis:mylineStyle } }; myarea={ silent:false, //图形是否不响应和触发鼠标事件,默认为 false,即响应和触发鼠标事件。 label:{ normal:mylabel, emphasis:mylabel }, itemStyle:{ normal:myitemStyle, emphasis:myitemStyle } }; series=[ { type:"bar", //柱形 zlevel:0, //柱状图所有图形的 zlevel 值。 z:2, //柱状图组件的所有图形的z值。控制图形的前后顺序。z值小的图形会被z值大的图形覆盖。 silent:false, //图形是否不响应和触发鼠标事件,默认为 false,即响应和触发鼠标事件。 name:"数据名称", //系列名称,用于tooltip的显示,legend 的图例筛选,在 setOption 更新数据和配置项时用于指定对应的系列。 legendHoverLink:true, //是否启用图例 hover 时的联动高亮。 coordinateSystem:"cartesian2d",'cartesian2d'使用二维的直角坐标系。'geo'使用地理坐标系 xAxisIndex:0, //使用的 x 轴的 index,在单个图表实例中存在多个 x 轴的时候有用。 yAxisIndex:0, //使用的 y 轴的 index,在单个图表实例中存在多个 y轴的时候有用。 label:{ //图形上的文本标签,可用于说明图形的一些数据信息,比如值,名称等, normal:mylabel, emphasis:mylabel }, itemStyle:{ //图形样式,normal 是图形在默认状态下的样式;emphasis 是图形在高亮状态下的样式,比如在鼠标悬浮或者图例联动高亮时。 normal:myitemStyle, emphasis:myitemStyle, }, stack:null, //数据堆叠,同个类目轴上系列配置相同的stack值可以堆叠放置。 cursor:"pointer", //鼠标悬浮时在图形元素上时鼠标的样式是什么。同 CSS 的 cursor。 barGap:"30%", //柱间距离,可设固定值(如 20)或者百分比(如 '30%',表示柱子宽度的 30%)。 barCategoryGap:"20%", //类目间柱形距离,默认为类目间距的20%,可设固定值 encode: { //可以定义 data 的哪个维度被编码成什么 x: [3, 1, 5], // 表示维度 3、1、5 映射到 x 轴。 y: 2, // 表示维度 2 映射到 y 轴。 tooltip: [3, 2, 4], // 表示维度 3、2、4 会在 tooltip 中显示。 label: 3 // 表示 label 使用维度 3。 }, data: [ //每一列称为一个『维度』。维度下标从0开始 [12, 44, 55, 66, 2], [23, 6, 16, 23, 1], [12, 44, 55, 66, 2], [23, 6, 16, 23, 1], [12, 44, 55, 66, 2], [23, 6, 16, 23, 1], ], markPoint:mypoint.data=[ {name: '最大值', type: 'max'}, {name: '某个坐标', coord: [10, 20]}, {name: '固定 x 像素位置', yAxis: 10, x: '90%'}, {name: '某个屏幕坐标', x: 100, y: 100}], markLine:myline.data=[ {name: '平均线',type: 'average'}, // 支持 'average', 'min', 'max' {name: 'Y 轴值为 100 的水平线',yAxis: 100}, [ {name: '最小值到最大值', type: 'min'}, // 起点和终点的项会共用一个 name {type: 'max'} ], [ {name: '两个坐标之间的标线',coord: [10, 20]}, {coord: [20, 30]} ], [ {yAxis: 'max',x: '90%'}, // 固定起点的 x 像素位置,用于模拟一条指向最大值的水平线 {type: 'max'} ], [ { name: '两个屏幕坐标之间的标线',x: 100,y: 100}, {x: 500,y: 200} ] ], markArea:myarea.data=[ [ {name: '平均值到最大值',type: 'average'}, {type: 'max'} ], [ {name: '两个坐标之间的标域',coord: [10, 20]}, {coord: [20, 30]} ], [ {name: '60分到80分',yAxis: 60}, {yAxis: 80} ], [ {name: '所有数据范围区间',coord: ['min', 'min']}, {coord: ['max', 'max']} ], [ {name: '两个屏幕坐标之间的标域',x: 100,y: 100}, {x: '90%',y: '10%'} ] ], tooltip:tooltip, }, ]; 复制代码
16. 授⼈以渔01_Echarts 配置项查看技巧
配置项查找方式
1 在echarts官网,点击顶部菜单【文档】,在下拉菜单中点击【配置项手册】 2 在“配置项手册”页面,有各种图形的详细配置项与使用方式介绍 3 当需要使用某种图形,又不知道有哪些属性可以使用时,可以在此页面找到使用方式 复制代码
17. Echarts 折线图(line)详解基本配置
首先引入echarts工具 // vue文件中引入echarts工具 let echarts = require('echarts/lib/echarts') require('echarts/lib/chart/line') // 以下的组件按需引入 require('echarts/lib/component/tooltip') // tooltip组件 require('echarts/lib/component/title') // title组件 require('echarts/lib/component/legend') // legend组件 option配置 // option将要设置以下字段感觉就足够使用了 option: { legend: {}, xAxis: {}, yAxis: {}, label: {}, tooltip: {}, series: [] } legend字段,是为了配置下图的表现的;注意data字段的数组需要对应每条折线的名称 鼠标hover到最顶部的legend标志,可以标志对应的折线图,点击legend标志会隐藏对应的折线图 legend: { data: ['招商银行', '浦发银行', '广发银行', '上海银行'] }, legend xAxis,配置x轴数据、样式、名称 xAxis: { type: 'category', // 还有其他的type,可以去官网喵两眼哦 data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], // x轴数据 name: '日期', // x轴名称 // x轴名称样式 nameTextStyle: { fontWeight: 600, fontSize: 18 } }, xAxis yAxis,配置y轴名称,样式 yAxis: { type: 'value', name: '纵轴名称', // y轴名称 // y轴名称样式 nameTextStyle: { fontWeight: 600, fontSize: 18 } } yAxis tooltip,鼠标放到折线图上展示的数据展示样式 tooltip: { trigger: 'axis' // axis item none三个值 }, trigger: 'axis' trigger: 'item' series,y轴数据,每条折线的名称 series: [ { name: '招商银行', data: [820, 932, 901, 934, 1290, 1330, 1320], type: 'line' }, { name: '浦发银行', data: [620, 711, 823, 934, 1445, 1456, 1178], type: 'line' }, { name: '广发银行', data: [612, 920, 1140, 1160, 1190, 1234, 1321], type: 'line' }, { name: '上海银行', data: [234, 320, 453, 567, 789, 999, 1200], type: 'line' } ] html标签代码,注意要先写好div的宽度和高度,否则这折线图展示不出来 // 折线图显示在这个div中, <div id="myChart"></div> 渲染折线图 let myChart = echarts.init(document.getElementById('myChart')) myChart.setOption(this.option) 完成折线图 复制代码
18. Echarts 折线图(line)详解 动态数据展示
ECharts,一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari等),底层依赖矢量图形库 ZRender,提供直观,交互丰富,可高度个性化定制的数据可视化图表。 1、echarts官网地址 上面有很多实例,也可以在线定制你需要的模板,非常方便 https://www.echartsjs.com/zh/index.html 2、使用时需要先引入echarts对应的js(在官网有对应的js包) <!-- 引入 ECharts 文件 --> <script src="static/js/echarts/echarts.min.js"></script> 3、使用ajax获取数据并使用echarts工具展示 注意: ajax的async属性 要求为Boolean类型的参数,默认设置为true,所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为false。同步请求将锁住浏览器,用户其他操作必须等待请求完成才可以执行,我这里使用的是同步请求。 异步和同步的区别:https://blog.csdn.net/qq_37148705/article/details/102912934 a.前端jsp页面展示 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE html> <html lang="en"> <head> <base href="<%=basePath%>"> <%@ include file="../system/admin/top.jsp"%> <!-- 引入 ECharts 文件 --> <script src="static/js/echarts/echarts.min.js"></script> </head> <body> <div id="main" class="list-main"> <!-- 为 ECharts 准备一个具备大小(宽高)的 DOM --> <div id="areaone" style="width: 600px;height:400px;"></div> <div id="areatwo" style="width: 600px;height:400px;"></div> <script type="text/javascript"> var goodsNamedata = []; var salesMountdata = []; var url = "goodssale/getgoodsall"; <!--使用ajax动态获取数据,将获取的数据放到数组中--> $.ajax({ async: false, type: "GET", url: url, dataType: 'json', contentType: "application/json;charset=UTF-8", success: function(result){ for (var i = 0; i < result.length; i++) { goodsNamedata.push(result[i].goodsName); salesMountdata.push(result[i].salesVolume); } } }); // 基于准备好的dom,初始化echarts实例 var myChartone = echarts.init(document.getElementById('areaone')); // 指定图表的配置项和数据 var optionone = { title: { text: 'ECharts动态展示数据' }, tooltip: {}, legend: { data: ['销量'] }, xAxis: { data: goodsNamedata }, yAxis: {}, series: [{ name: '销量', type: 'bar', data: salesMountdata }] }; // 基于准备好的dom,初始化echarts实例 var myChartwo = echarts.init(document.getElementById('areatwo')); optiontwo = { xAxis: { type: 'category', boundaryGap: false, data: goodsNamedata }, yAxis: { type: 'value' }, series: [{ data: salesMountdata, type: 'line', areaStyle: {} }] }; // 使用刚指定的配置项和数据显示图表。 myChartone.setOption(optionone); myChartwo.setOption(optiontwo); </script> </div> </body> </html> b.controller层,返回list集合 @RequestMapping(value = { "/getgoodsall" }, method = {RequestMethod.GET }, produces = {JSON_UTF8}) @ResponseBody public List getGoodsAll(){ List<GoodsSale> goodsSalesList = null; try { goodsSalesList = goodsSaleService.listAll(); return goodsSalesList; }catch (Exception e){ logger.debug(e); return goodsSalesList; } } c.mapper这里表示查询数据库的全部 <!-- 列表(全部) --> <select id="listAll" parameterType="String" resultMap="goodsSaleResultMap"> select * from goods_sale a </select> 1 2 3 4 d.数据库信息 goods_name表示商品名字,sales_volume表示销量
-
【互动媒体】”十二个一“的文艺创作的文本分析与可视化
2020-01-08 00:11:24互动媒体的大作业之一。似乎一整个学期都在和这十二个一打交道,尝试了看待一个...对全体同学的文艺创作进行文本分析、统计和数据可视化 2.任务要求 整理大家的作业数据,运用NLP技术(自然语言处理)对其进行分析...互动媒体的大作业之一。似乎一整个学期都在和这十二个一打交道,尝试了看待一个简单书法作品的多种维度,也发掘了诸如拟人化、拟物化等在内的多种其他视角。然而,不到期末我们就永远不知道这些数据最后将会去向哪里、会被用来做什么。
——————————————————
1.任务主题
对全体同学的文艺创作进行文本分析、统计和数据可视化
2.任务要求
整理大家的作业数据,运用NLP技术(自然语言处理)对其进行分析,完成一篇图文结合的分析报告,特别是要分别对十二个“一”有关的文本分别进行统计。
最好直接调用现成的NLP库来实现;报告中若能将文本分析结果与之前的关于十二个”一“的感受评分数据对比分析更佳;——————————————————
3.我们的工作
在本次实验中,我们依旧将我们的关注重心放在12个”一“的本身上。我们想要通过观测、提取以及分析测试者对于12个“一”的感知以及对于它们的不同认知感受来抽象出这些内容与书法本身的关系,并给出一套可视化的方案,以展示我们的工作。
我们的工作主要包含以下的方面:
1.首先,我们将对所有数据进行手动的整理规划,并采取一种较好的方式来对所有的数据进行重新存放。
2.其次,我们利用每一个”一“获得的测试者的描述和设定的文本,利用snownlp以及jieba库来实现数据分析。
3.在整理文章的过程中,我们发现并不是所有的测试者都对所有的12个一进行了设定策划,一部分同学只是从中选取了4-6个一为部分书法构思人设。我们因此产生疑问:是否这些被单独选出来的”一“更加具有独特性或者最为富有代表性?我们也对它进行了分析研究。
4.整理在2中得到的数据,分析结果并且将它们做一个较为完整的分析以及可视化。我们的第一步是手动提取受试者的创作文本。由于每个人写的文章主观性极大,且文本结构、排版、思路都不一样甚至有一些并不规范,我们原来想通过某种方法用代码自动筛选、归类文本,但是结果并不尽如人意,因此我们还是选择了手动提取。
我们由于时间问题,选取了1703/1704班的40名受试者,我们阅读他们的创作文本,把对于每一个“一”的设定文字剪裁下来,对应到每一个“一”上。每一个受试者拥有一个目录,目录下存放每一个“一”的txt文本。
让我们先把十二个“一”摆上来。
可以看出,就算没有对它们进行仔细细致的研究,我们也可以一眼就发现它们的书写方式是不同的,有一些比较相近,而有一些在粗细、倾斜度等各方面都有较大的的差异,有的粗狂,有的纤细。但是对于力度以及它们表现的情感, 每个人都是不太一样的。——————————————————
4.词频分析
我们需要知道每一个“一”受试者都给它们赋予了什么样的角色,其中一个方法就是分门别类地进行词频方面的研究。如果一个词在文本中频繁出现,如果它是一个名词,那么就很有可能是用户描绘的或者是拟人、拟物化的角色,这将除了为我们提供用户的故事版之外别无意义,因此比较重要且有用的是形容词。
因此,我们把所有数据中有关第一号“一”的部分连接成一段文字,然后对这段文字进行分词。分词完成后,我们需要根据它们的词性进行筛选,选出我们需要的形容词来。然后再统计、分析。
首先遍历每一个测试者文件夹中的文本文件:for rootdir, dirs, files in os.walk(rootdir): for dir in dirs: dir_path = os.path.join(rootdir, dir) # 获取子目录路径 namesdir.append(dir_path) sampleNum = len(namesdir)
# 获取每个人分析的一 for name in namesdir: # print(name) texts = os.listdir(name) # 分类存放 for text in texts: (filename, extension) = os.path.splitext(text) text = os.path.join(name, text) if filename == "1": oneIndex1.append(text) pass ...... ...... ...... if filename == "12": oneIndex12.append(text) pass else: pass
提取所有的文本,集合到一个txt:
textdir = None TXT = [] for textdir in oneIndex12: txt = None try: txt = open(textdir, encoding="ansi").read() except UnicodeDecodeError: try: txt = open(textdir, encoding="utf-8").read() except UnicodeDecodeError: print("出错") TXT.append(txt) print(TXT)
进行分词并加载停用词表用以过滤掉不需要出现的中文单词:
""" 分词 """ txt = "".join(TXT) # 加载停用词表 stopwords = [line.strip() for line in open("stop.txt", encoding="utf-8").readlines()]
筛选形容词,计算词频 :
""" 词性分析 """ counts = {} # 通过键值对的形式存储词语及其出现的次数 for x in psg.cut(txt): # if word not in stopwords: if x.flag.startswith('a'): if len(x.word) == 1: # 单个词语不计算在内 continue else: counts[x] = counts.get(x, 0) + 1 # 遍历所有词语,每出现一次其对应的值加 1 items = list(counts.items()) # 将键值对转换成列表 items.sort(key=lambda x: x[1], reverse=True) # 根据词语出现的次数进行从大到小排序 for i in range(min(50, len(items))): x, count = items[i] print("{0:<5}{1:>5}".format(x.word, count))
结果是例如这样的输出:
这是我们对第12个“一”进行分析的结果。
这个“一”是这一号:
我们提取到词频较高的词“纤细”、“谨慎”、“细腻”等都可以对应上这个字形。
我们对所有的词频分析进行了一个词云图展现,这将有利于我们对这些所有的文本进行总体的把握和感知。编号 一 词云图 1 2 3 4 5 6 7 8 9 10 11 1 2 ——————————————————
5.关键词抽取
基于textRank算法生成关键词。这样做的意义是我们能够从所有测试者提供的文本中得到这个“一”比较具有代表性的词汇,但是我们个人认为由于关键词计入名词和动词,对分析“十二个一”的特征来说干扰因素还是有些太过于明显,所以我们觉得它的意义并不是很大。不过也把结果放上来:
——————————————————6.情感分析
受试者在进行创作的时候,自身的心情以及对这个“一”的喜好程度都会使得他在对文艺创作的时候带入自己的主观情感,也因此影响到他对于这个“一”的演绎和设定。
snowNLP提供了一种封装好的方法来检测文本的情绪状况,用于分析受试文本的情感那倾向。一般而言,人对情感倾向分为正面和负面。snowNLP能够对文本进行分析,提取出关键的带有情绪的词汇来累加计算整个文章的情绪指向。在文本中发现一个消极的词汇,结果就会减小,发现正向积极的词汇则会增加。最后我们得出一个情绪的分值,这个数值越接近1,表示人的情感倾向越偏向正面的、积极的,越接近0表示越消极、越负面。
我们对十二个一进行分析,得到的最终结果是:编号 一 情绪值 1 0.937641821147647 2 0.866497779143834 3 0.782580641617419 4 0.849064394112572 5 0.758883835001596 6 0.860064893889249 7 0.891415268611471 8 0.861417124824973 9 0.880712433042183 10 0.850743745166771 11 0.856084233096879 12 0.882050871980078 可以发现所有的“一”的文本,其情感倾向分值都稳定在0.85左右。这是一个好的现象,说明人们在创作的过程中积极的内容还是要大于负面的内容,于是赋予“一”的情绪情绪倾向也较为正面。
我们对它们稍作分析,可以看出,笔迹较为柔和、没有很多棱角的“一”,其情绪倾向都基本能够突破0.85,而分值低于0.82的,一般笔迹较粗、线条硬而没有变化。
分值最高的1号“一”很显然具备了舒展、平滑等优点而不失干脆果敢,大多数人在评判它的时候表现出来的情感倾向都是正面的。(好巧,我们也喜欢这个一。)
代码:sum = 0 textdir = None TXT = [] # 获取所有的1号“一”的词频 for textdir in oneIndex12: txt = None try: txt = open(textdir, encoding="ansi").read() except UnicodeDecodeError: try: txt = open(textdir, encoding="utf-8").read() except UnicodeDecodeError: print("出错") # print(txt) s = SnowNLP(txt) sum += s.sentiments print(sum / len(oneIndex12))
————————————————
7.文本分析中一个有意思的小点
上一节我们通过分析各个“一”的文本来对人们对于“一”的创作感知进行了一个体现。我们在分析的过程中还发现了一个问题。当时我们写作业的时候,部分人选择了第二个选题,即在所有的一中选择4个以上的“一”进行创作,而不是整体的、泛化的研究。在这样的情况下受试者究竟会优先选择哪些“一”来作为故事的主人公,也是一个值得关注的问题。这反映了多个“一”之间的相似程度、差异程度以及特征程度。
比如,当我们选择哪一些一来进行创作的时候,一般我们都不会挑选我们非常不喜欢的,其次,当我们发现有多个一给我们的感受比较相似的时候,我们就很有可能要花费一些时间来仔细斟酌我们的选择,而结果往往是,我们会选择这两者之间他更喜欢的。
此外,对于一些人而言,选取的角色需要体现角色的个性,所以他们可能会选择最富有个性的那些,而不是相似的那些。因此,当一个人选择了四个“一”来创作的时候,这四个“一”很有可能是最具有个性的四个,也有可能是最能代表这十二个“一”中几大维度的四个,总之,他们的相似度应该不会太高。
我们尝试一下提取它:for rootdir, dirs, files in os.walk(rootdir): for dir in dirs: dir_path = os.path.join(rootdir, dir) # 获取子目录路径 namesdir.append(dir_path) print(namesdir) sampleNum = len(namesdir) print("样本数:" + str(sampleNum)) # 获取每个人分析的一 for name in namesdir: # print(name) texts = os.listdir(name) if len(texts) < 9: # 分类存放 for text in texts: (filename, extension) = os.path.splitext(text) text = os.path.join(name, text) if filename == "1": oneIndex1.append(text) pass ...... ...... ...... else: pass print(oneIndex1) .... print(oneIndex2)
由此,我们选取那些选择了9个以下“一”的人(因为不知道为什么大家用的数据有些是不一样的,有些并没有出现在我们分析统计的那些“一”的范畴),小于9就说明他们没有全都选,而是只选择了一部分。让我们来看一下结果。
我们来看看这些被选了10次以上的“一”都有哪些。
1:10次
5:12次
7:12次
9:15次
其他的都被选了5次或者6次,非常平均。
这个结果符合我们的预期吗?
很显然,它符合。
第一个1作为在情感分析中夺冠的一个,被多次选择是不奇怪的。
第五个1是粗笔迹中比较出色的一个。参考词频分析的结果,厚重、稳重、冷静是它比较出色的特征提取,这与其他三个灵动、活泼、温柔等的关键词不同,作为它的特色是很有说服力的。
第7个一也是所有12个一中比较有特色的一个。作为唯一一个墨迹不明显、更硬朗更干脆、更加现代化的笔触成为了它在其余11个一中最有辨识度的一个。
第九个一刚好也是我们想选的,而且它不负众望地出现在了名单上。9号一是12个一中在起落笔锋上最有代表性的一个。它笔锋柔和、墨迹柔软潇洒,也可以说“最为花哨”,被选择是容易预见到的结果。此外,我们在作业一中分析的到的数据:
.可以发现,这样的结果还是在我们预想范围内的,可以说是一个合理的分析结果了。————————————————
7.总结心得
本来有过对这个测试的预想,但实际出来的结果,有在预料之中,也有在预料之外的。不过总体来说,我们认为我们采用各种方式限制分析结果的随机性、减少分析过程的干扰因素的做法还是比较成功的。
经过这样的分析,对这一整个学期做的“一”相关的研究已经不是那么仇恨了。甚至在进行数据分析的过程中还觉得数值分析挺有意思的。毕竟在统计学上,数据永远要比人的感觉来得更有说服力。 -
数据可视化--实验六:层次和网络可视化、文本可视化
2021-01-01 17:51:22数据可视化–实验六:层次和网络可视化、文本可视化 文章目录数据可视化--实验六:层次和网络可视化、文本可视化概要实验过程Pyecharts实验结果邮件往来网络图职位树图邮件主题词云图实验结论 概要 学院:计算机...数据可视化–实验六:层次和网络可视化、文本可视化
概要
- 学院:计算机科学与技术学院
- 实验日期:2020-10-17
- 实验目的: 掌握层次和网络可视化、文本可视化工具方法
- 实验内容:
- 现有xx公司一个月内研发部门成员间的邮件往来记录(email_dev_inside.xlsx),请根据以下要求完成对该公司的研发部门的可视化分析:
- 1、对邮件往来数据进行处理,选择合适的图表,展示公司研发部门的成员组织结构,分别找出每个群体的负责人。
- 2、对邮件内容数据进行处理,分析研发部门以及每个群体中的主要工作内容。
- 现有xx公司一个月内研发部门成员间的邮件往来记录(email_dev_inside.xlsx),请根据以下要求完成对该公司的研发部门的可视化分析:
- 注:表格文件在我的资源中免费下载。名为“数据可视化实验–表格附件”。
实验过程
本次实验选择编程类工具Pyecharts。
Pyecharts
在Pycharm中新建python项目,并引入pyecharts,openpyxl等必要包。
创建main.py,写入以下内容。
#!/usr/bin/env python # coding:utf-8 """ Name : main.py Author : F Time : 2020/10/17 21:03 Desc : 数据可视化实验六 """ import copy import openpyxl from pyecharts.charts import Graph, Tree, WordCloud, Page from pyecharts import options as opts from pyecharts import globals globals._WarningControl.ShowWarning = False # 关闭pyecharts给出的警告 bigBoss = ['1007', '1059', '1068'] def getData(): filename = "email_dev_inside.xlsx" ws = openpyxl.load_workbook(filename)['Sheet1'] theData, resNodes, theLinks, theCategories, theNodes = [], [], [], [], set() for i in range(2, ws.max_row + 1): row = str(i) theData.append([ws['G' + row].value[:4], ws['H' + row].value[:4], ws['I' + row].value]) theLinks.append({'source': ws['G' + row].value[:4], 'target': ws['H' + row].value[:4]}) theNodes.add(ws['G' + row].value[:4]) theNodes.add(ws['H' + row].value[:4]) for node in theNodes: resNodes.append({'name': node, 'symbolSize': 1, 'draggable': 'False', 'value': 1, 'category': '', 'label': {'normal': {'show': 'False'}}}) return theData, resNodes, theLinks, theCategories def drawEmailGraph(graph_nodes: list, graph_links: list, graph_categories: list): Graph(opts.InitOpts(width="2000px", height="2000px")).add( "", graph_nodes, graph_links, graph_categories, repulsion=50, linestyle_opts=opts.LineStyleOpts(curve=0.2), label_opts=opts.LabelOpts(is_show=False), ).set_global_opts( legend_opts=opts.LegendOpts(is_show=False), title_opts=opts.TitleOpts(title="研发部邮件来往图"), ).render("研发部邮件来往图.html") def getLittleBoss(big_boss: list): little_boss = {} for bBoss in big_boss: little_boss[bBoss] = set() for link in links: if link['source'] in big_boss and link['target'] not in bigBoss: little_boss[link['source']].add(link['target']) elif link['target'] in big_boss and link['source'] not in bigBoss: little_boss[link['target']].add(link['source']) for k, v in little_boss.items(): little_boss[k] = list(v) little_boss[k].sort() return little_boss def getRank(): the_rank = {} for bBoss in bigBoss: the_rank[bBoss] = {} littleBoss = getLittleBoss(bigBoss) for k, v in littleBoss.items(): employee = getLittleBoss(v) for lBoss in v: the_rank[k][lBoss] = employee[lBoss] return the_rank def getGroupEmail(): email_content = copy.deepcopy(rank) for bBoss, groups in email_content.items(): for lBoss, employeeList in groups.items(): email_content[bBoss][lBoss] = getListEmail(employeeList) return email_content def getListEmail(theEmployeeList: list): emailContent = {} wordList = [] for d in data: if d[0] in theEmployeeList or d[1] in theEmployeeList: if emailContent.__contains__(d[2]): emailContent[d[2]] += 1 else: emailContent[d[2]] = 0 for k, v in emailContent.items(): wordList.append(tuple((k, str(v)))) return wordList def getTreeData(): tree_data, children = {'name': '成员结构图', 'children': []}, [] for bBoss, groups in rank.items(): tree_data['children'].append({'name': bBoss, 'children': []}) for lBoss, employeeList in groups.items(): for employee in employeeList: children.append({'name': employee, 'value': 1}) tree_data['children'][tree_data['children'].__len__() - 1]['children'].append( {'name': lBoss, 'children': children}) children = [] return tree_data def drawTree(tree_data): Tree(opts.InitOpts(width="3500px", height="2000px")).add( "", [tree_data], collapse_interval=2, orient="TB", initial_tree_depth=-1, label_opts=opts.LabelOpts( position="top", horizontal_align="right", vertical_align="middle", rotate=-90, ), ).set_global_opts(title_opts=opts.TitleOpts(title="成员结构图")).render("成员结构图.html") def drawWordCloud(cloud_data: dict): page = Page() for bBoss, groups in cloud_data.items(): for lBoss, employeeList in groups.items(): wordCloud = WordCloud() wordCloud.add(series_name=bBoss + '-' + lBoss + "邮箱内容分析", data_pair=employeeList, word_size_range=[6, 66]).set_global_opts( title_opts=opts.TitleOpts( title=bBoss + '-' + lBoss + "邮箱内容分析", title_textstyle_opts=opts.TextStyleOpts(font_size=23) ), tooltip_opts=opts.TooltipOpts(is_show=True), ) page.add(wordCloud) page.render("邮箱内容分析.html") if __name__ == '__main__': data, nodes, links, categories = getData() # 从xlsx拿到数据 rank = getRank() # 拿到整个阶级顺序 drawEmailGraph(nodes, links, categories) # 画出邮件来往网络图 drawTree(getTreeData()) # 画出阶级图 drawWordCloud(getGroupEmail()) # 画出每个群体的邮件内容词云 # 由EmailGraph可见,研发部分为3个群体。群体负责人的邮箱用户名依次是1007,1059,1068。 # 群体之间都不会互相通信,同时每个群体又分为多个小群体,小群体之间同样也不会互相通信。 # 拿到3个大群体的负责人之后,可以拿到这三个人的通信记录,便可以得到每个小群体的主要负责人。 # 同样地,可以拿到每个小群体的成员,拿的时候要注意避免将3个大群体的负责人认作为小群体的成员。 # 然后对每个大群体和小群体的邮件内容生成词云,即可获得每个群体的工作内容。 # 由Tree可以清晰地看出来部门的层次 # 由WordCloud可以看出来每个群体的主要工作内容
代码流程:
- 读取Excel文件email_dev_inside.xlsx拿到往来邮件的邮箱用户名(四位数字)和邮件主题。
- 根据往来邮件的邮箱用户名画出网络图,观察部门群体形态。
- 根据部门群体形态可以判断出研发部分为3个群体。群体负责人的邮箱用户名依次是1007,1059,1068。群体之间都不会互相通信,同时每个群体又分为多个小群体,小群体之间同样也不会互相通信。
- 根据群体负责人和小群体负责人,划分出部门的职位树图。
- 根据划分的不同小群体及其邮件主题,画出每个小群体的邮件主题词云图。
- 观察词云图,可以得出每个群体的主要工作内容。
实验结果
邮件往来网络图
邮件往来网络图如下所示,可以通过网络图可以得出主要负责人。
对上图进行分析:
- 此研发部门主要分为3个群体,负责人的邮箱用户名依次是1007,1059和1068
- 每个群体又分为不同的小群体,并且每个小群体中有一个负责人。
- 每个大群体之间不会相互通信,每个小群体之间也不会相互通信。
职位树图
对上图进行分析:
- 可以清晰地看出整个部门的结构层次,图中数字为邮箱用户名。
邮件主题词云图
对上图进行分析:
- 由邮件主题词云图可以看出每个小群体的主要工作,以负责人邮箱用户名为索引,结论如下:
- 1007
- 1087:技术分享安排,部署与计划
- 1092:需求、API、项目计划、问题与风险
- 1115:前端开发、测试、配置、部署
- 1125:概要设计、文档撰写
- 1172:开发设计、实施方案
- 1192:特殊字段说明、用户管理与例会
- 1199:后端开发、文档接口与平台
- 1224:软件部署运维
- 1230:软件测试
- 1281:软件部署与实施测试
- 1059
- 1057:软件开发实施监管
- 1058:软件概要设计
- 1079:技术分享
- 1080:需求调研、设计概要
- 1096:软件实施
- 1101:系统配置子系统相关
- 1119:软件实施与数据分析
- 1143:总监管
- 1155:特殊字段说明
- 1211:软件开发文档撰写
- 1228:软件实施与地图配置
- 1376:需求调研与传输设置、特殊字段处理
- 1487:系统规划,需求与原型设计
- 1068
- 1060:地图配置
- 1098:工程初验
- 1100:平台配置设置
- 1154:地图配置
- 1191:工程测试与终验
- 1207:项目测试数据处理
- 1209:软件开发文档管理
实验结论
- 研发部负责人树状图和其下人员的主要工作如下所示,其中数字为人员邮箱用户名(即邮箱前四位数字)
- 1007
- 1087:技术分享安排,部署与计划
- 1092:需求、API、项目计划、问题与风险
- 1115:前端开发、测试、配置、部署
- 1125:概要设计、文档撰写
- 1172:开发设计、实施方案
- 1192:特殊字段说明、用户管理与例会
- 1199:后端开发、文档接口与平台
- 1224:软件部署运维
- 1230:软件测试
- 1281:软件部署与实施测试
- 1059
- 1057:软件开发实施监管
- 1058:软件概要设计
- 1079:技术分享
- 1080:需求调研、设计概要
- 1096:软件实施
- 1101:系统配置子系统相关
- 1119:软件实施与数据分析
- 1143:总监管
- 1155:特殊字段说明
- 1211:软件开发文档撰写
- 1228:软件实施与地图配置
- 1376:需求调研与传输设置、特殊字段处理
- 1487:系统规划,需求与原型设计
- 1068
- 1060:地图配置
- 1098:工程初验
- 1100:平台配置设置
- 1154:地图配置
- 1191:工程测试与终验
- 1207:项目测试数据处理
- 1209:软件开发文档管理
数据可视化–实验六:层次和网络可视化、文本可视化实验完成,两项实验结果均符合要求,实验成功。
-
数据可视化练习——会议论文收录信息可视化与分析
2020-02-05 20:03:11对于这个网页上的论文标题与作者信息,需要通过爬虫技术将其整理在文本中,并对其进行预处理,包括分词、词频统计等。之后,需要对研究热点词汇、高产作者、论文数量、论文标题长度等信息进行统计分析... -
D3临摹作业_分词与词云可视化(西安交大国家艺术基金数据可视化培训第28天)
2019-07-25 17:22:22概念:一种富文本信息可视化技术,通过布局算法用文字大小表示词频,辅以多种颜色,直观的反映词组重要性差异,展示文本关键摘要信息。完整的词云分析包括:分词、词频统计和可视化。 相关概念:标签云 词云 1997... -
Python电影爬虫可视化(机器学习算法) 记录一次数据分析过程
2020-05-20 10:20:14最近公司项目需要使用python爬虫进行数据爬取与可视化,我作为核心开发人员,由我完成。 我通过机器学习算法进行文本分类,对核心的数据通过echarts进行可视化。 技术 Flask Scrapy MySQL Anconda3 项目需求 把给定... -
-
从零开始学可视化数据分析师就业课程(Excel、 MySQL、Power BI、Tableau、python、R)
2018-09-17 13:51:13第6章: MySQL数据库安装、配置与可视化工具 任务54: 安装MySQL 任务55: 使用CMD登录mysql 任务56: 数据库数据类型 任务57: 约束 任务58: navicat介绍 任务59: navicat创建数据库 任务60: navicat填充数据 ... -
python大作业报告(爬虫 分析 可视化)_爬虫综合大作业——网易云音乐《Five Hours》爬虫&可视化分析...
2020-12-17 21:08:43做数据分析与文本分析。形成一篇文章,有说明、技术要点、有数据、有数据分析图形化展示与说明、文本分析图形化展示与说明。文章公开发布。1. 数据爬取我们本次爬取的对象是一首名为《five hours》的经典电音流行... -
covid-dashboard:如果您在公共卫生网络技术,数据建模和计算或可视化方面具有专业知识,请提供帮助-源码
2021-01-31 12:39:15COVID-19是一个严重的问题,我们的可视化和数据分析需要以审慎,认真的方式进行。 以下内容将是一个不错的阅读: 开发流程 有关技术的一些细节 统计建模 “建模”笔记本由Makefile中的“ modeling.py”文件生成。 ... -
盘点信息可视化趋势
2021-03-02 09:23:59下面我们来系统的说说这个话题~信息可视化(Informationvisualization)是一个跨学科领域,旨在研究大规模非数值型信息资源的视觉呈现,如软件系统之中众多的文件或者一行行的程序代码,以及利用图形图像方面的技术... -
大数据可视分析综述
2018-06-20 10:48:03在此基础上,讨论了面向大数据主流应用的信息可视化技术——面向文本、网络(图)、时空、多维的可视化技术.同时探讨了支持可视分析的人机交互技术,包括支持可视分析过程的界面隐喻与交互组件、多尺度/多焦点/多侧面... -
文本数据挖掘综述
2018-12-26 16:57:24摘要:当前,对于学习分析的研究,国内外研究者主要关注学习者在网络教学环境下产生的结构化数据,伴随...即课程评价支持、学习者知识与能力测评、学习共同体分组、学习行为危机预警、学习效果预测和学习状态可视化。 -
爬虫综合大作业——网易云音乐《Five Hours》爬虫&可视化分析
2019-04-28 19:30:00爬虫综合大作业 选择一个热点或者你感兴趣的主题。...做数据分析与文本分析。 形成一篇文章,有说明、技术要点、有数据、有数据分析图形化展示与说明、文本分析图形化展示与说明。 文章公... -
tableau基础可视化
2020-05-28 15:59:50Tableau是一款定位于数据可视化敏捷开发和实现的商务智能展现工具,可以用来实现交互的、可视化的 分析和仪表板应用,从而帮助企业快速地认识和理解分析数据,以应对不断变化的市场环境与挑战。 主要特性: 高效性:... -
大数据可视分析综述.pdf
2019-05-31 17:00:52在此基础上,讨论了面向大数据主流应用的信息可视化技术——面向文本、网络(图)、时空、多维的可视化技术.同时探讨了支持可视分析的人机交互技术,包括支持可视分析过程的界面隐喻与交互组件、多 尺度/多焦点/多侧面... -
信息可视化
2012-07-20 16:33:02信息可视化(英文:Information visualization)是一个跨学科领域,旨在研究大规模非数值型信息资源的视觉呈现,如软件系统之中众多的文件或者一行行的程序代码,以及利用图形图像方面的技术与方法,帮助人们理解和... -
[数据分析与智能计算] 第0章 前言
2021-04-01 22:23:58这门课作为上海大学计算机模块选修内容,内容涵盖数据科学基础知识,介绍了数据科学的工作流程,包括数据采集、数据整理和探索、数据可视化和数据建模预测等技术,并通过文本、图像、语音等前沿应用,引入人工智能... -
大数据可视分析综述_任磊.pdf
2019-11-20 19:06:51在此基础上,讨论了面向大数据主流应用的信息可视化技术——面向文本、网络(图)、时空、多维的可视化技术.同时探讨了支持可视分析的人机交互技术,包括支持可视分析过程的界面隐喻与交互组件、多尺度/多焦点/多侧面... -
电力三维可视化是如何实现的
2020-12-30 17:00:46信息可视化就是对抽象数据进行直观视觉呈现的研究,抽象数据既包含数值数据,也包含非数值数据如文本信息、地图信息等,它们可通过利用图形图像处理、人机交互、人工智能的技术与方法,帮助人们理解和分析数据。与... -
MySQL技术之旅-慢查询日志可视化平台的使用(Anemometer)
2015-09-10 15:26:11对于DBA来说,几乎每天都会与数据库的慢查询打交道,传统的慢查询分析报告是文本形式存在的,Anemometer是一种基于pt-query-digest解析慢查日志后数据入库并在web界面展示的工具,方便DBA对数据库慢查询的观测和统计... -
数据挖掘技术论述与介绍
2009-01-19 15:16:36使数据可视化:分析人员需搞清楚数据库中存储的大量信息的含意。在做任何分析之前,需先将待处理的数据人性化,并寻找显示数据的好方法。 。纠正数据:在结合大规模的数据库时,数据库的数据常常是不完整的,而且... -
python xticks()函数设置x轴方法--刻度、标签_使用可视化扩展库matplotlib的模块pyplot中的xticks()函数...
2021-01-14 18:32:06Python数据分析与数据可视化:使用可视化扩展库matplotlib的模块pyplot中的xticks()函数设置x轴刻度时,下面哪个参数用来设置刻度文本的旋转角度?【单选题】A:degreeB:degC:rotationD:rotPython数据分析与数据可视化... -
python数据分析随书代码
2018-05-31 11:08:22python数据分析/(印尼)伊德里斯(Idris.I.)著,韩波译。 资源包括所有章节的示例代码。需要用到python2和pip。 编辑推荐 实用的Python开源模块的大集合; 简单易懂、示例丰富的数据分析教程; 掌握数据可视化... -
课程-Python-数据分析-源码
2021-02-28 12:24:22教学大纲 第1节(简介) ...第6节(数据可视化) Matplotlib,Seaborn,Plotly 条形图(水平和垂直) 散点图 相关图 线图 第7节(机器学习) 线性回归 逻辑回归 决策树 随机森林 极端梯度提升 第8节 -
Python金融大数据分析 带书签
2017-09-28 15:27:28其内容涵盖了Python的数据类型和结构、用matplotlib进行数据可视化、金融时间序列数据处理、高性能输入/输出操作、高性能的Python技术和库、金融学中需要的多种数学工具、随机数生成和随机过程模拟、Python统计学... -
LJCluster文本聚类技术中间件
2010-03-09 13:47:58适用于自动生成热点舆论专题、重大新闻事件追踪、情报的可视化分析等诸多应用。 灵玖Lingjoin(www.lingjoin.com)基于核心特征发现技术,突破了传统聚类方法空间消耗大,处理时间长的瓶颈;不仅聚类速度快,而且... -