Plotly 是一款在线的数据分析和数据可视化工具,可以在线绘制条形图、散点图、饼图、直方图等等。同时它支持在线编辑,以及python、javascript、matlab、R等许多API,这里就以python为例,简单介绍一下Plotly。
(一)准备
进入主页,往下找,可以看到有好多图标类型:
先来,随便点开一个条形图(Bar Charts),可以看到有示例代码,代码比较详细,在这里就不说了,感兴趣的可以自己运行一下,需要注意的是,要提前下载plotly的python库,老样子:
pip install plotly
本次使用的数据,就以之前爬取的拉勾网Python招聘信息,之前只爬取了前五页,这次稍微将代码修改一下,爬取全部三十页的招聘信息,lg_spider.py修改如下:
# -*- coding:utf-8 -*-
import scrapy
from bs4 import BeautifulSoup
class lg_spider(scrapy.Spider):
name = 'lg' # 爬虫名字
def start_requests(self):
urls = ['https://www.lagou.com/zhaopin/Python/',
]
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}
for x in range(1,31):
yield scrapy.Request(url=urls[0] + str(x), headers=headers, callback=self.parse)
def parse(self, response):
# 使用Beautiful Soup进行分析提取
soup = BeautifulSoup(response.body, 'html.parser')
for info in soup.find_all('li', 'con_list_item default_list'):
# 将提取的salary字符串,只截取最少工资并转换成整数形式,如:7k-12k -> 7000,因为存在K大小写不统一,所以统一变为小写
salary = info.attrs['data-salary'].lower()
salary = salary.split('k')[0]
salary = int(salary) * 1000
href = info.find('a', 'position_link').attrs['href']
href = 'http:' + href
# 存储爬取的信息
yield {
'title': info.attrs['data-positionname'], # 职位
'position': info.find('em').get_text().split('·')[0], # 工作地点
'salary': salary, # 最低工资
'time': (info.find('span', 'format-time')).string, # 发布时间
'grade': info.find('div', 'li_b_l').get_text().split('/')[-1].replace('\n', '').rstrip(), # 学历要求
'company': info.attrs['data-company'], # 公司名称
'href': href
}
其中href属性可加可不加,无所谓,加的话需要修改相关item,数据库等信息。
(二)进入正题
plotly已经有了,MySQL数据也有了,下面开始进入正题,如何使用Plotly图形化MySQL中的工具,为了便于Plotly的处理,先下载一个Python数据分析包Pandas
pip install pandas
招聘地区统计
代码实现:
# -*- coding:utf-8 -*-
import pymysql
import pandas
import plotly as py
import plotly.graph_objs as go
# 注册的Plotly账户和密码
py.tools.set_credentials_file(username='YOUR_NAME', api_key='YOUR_PASSWORD')
#数据库连接信息
db_config ={
'host': '127.0.0.1',
'port': 3306,
'user': 'root',
'password': '',
'db': 'lg_info',
'charset': 'utf8'
}
# 获得数据库连接
connection = pymysql.connect(**db_config)
# SQL语句,计算各地区数目
with connection.cursor() as cursor:
sql = 'select position,count(*) from info01 GROUP BY position'
cursor.execute(sql)
rows = cursor.fetchall()
# 使用Pandas中的DataFrame处理便于plotly的使用,转换成DataFarame的格式,类似二维表
df = pandas.DataFrame([[ij for ij in i] for i in rows])
df.rename(columns={0: 'position', 1: 'count'}, inplace=True)
# 数据绘图,横纵坐标分别为地区和数量
trace1 = go.Bar(
x=df['position'],
y=df['count']
)
data = [trace1]
# 离线形式存储形成的图表
py.offline.plot(data, filename='g:/test.html')
同样的原理,可以做如下统计图表,其中的关键点就是SQL语句的书写,再就是各种图表API的使用,这个可以参照官网给出的例子,十分详细。