爬虫入门之绘图matplotlib与词云(七)
1 绘制条形图
import matplotlib # 数据可视化 from matplotlib import pyplot as plt # 配置字体 matplotlib.rcParams["font.sans-serif"] = ["simhei"] # 黑体 matplotlib.rcParams["font.family"] = "sans-serif" ''' left, x轴 height, y轴 width=0.8 ,轴宽 ''' # .bar(x轴, y轴, label=u"标签名", color="颜色") plt.bar([1], [123], label="广州", color="r") plt.bar([2], [141], label=u"北京") plt.bar([3], [11], label=u"上海") plt.bar([4], [41], label=u"深圳") plt.bar([5], [181], label=u"香港") plt.legend() # 绘图 # plt.show() plt.savefig("1.jpg") # 保存图片
2 绘制智联招聘职位岗位数量图
import urllib.request import urllib.parse import re import matplotlib import matplotlib.pyplot as plt # 数据可视化 matplotlib.rcParams["font.sans-serif"] = ["simhei"] # 配置字体 matplotlib.rcParams["font.family"] = "sans-serif" header = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"} def getnumberbyname(searchname): searchname = {"kw": searchname} searchname = urllib.parse.urlencode(searchname) url = "http://sou.zhaopin.com/jobs/searchresult.ashx?jl=%E6%B7%B1%E5%9C%B3&" + searchname + "&p=1&isadv=0" print(url, '==========') req = urllib.request.Request(url, headers=header) pagesource = urllib.request.urlopen(req).read().decode('utf-8', 'ignore') restr = "<em>(\\d+)</em>" # 正则表达式,()只要括号内的数据 regex = re.compile(restr, re.IGNORECASE) mylist = regex.findall(pagesource) return mylist[0] # 岗位列表 pythonlist = ["python", "python 运维", "python 测试", "python 数据", "python web"] num = 0 for pystr in pythonlist: num += 1 print(pystr, eval(getnumberbyname(pystr))) # 绘制柱状图 plt.bar([num], eval(getnumberbyname(pystr)), label=pystr) plt.legend() # 绘制 plt.show() # 显示
3 词云
“词云”这个概念由美国西北大学新闻学副教授、新媒体专业主任里奇·戈登(Rich Gordon)提出。“词云”就是对网络文本中出现频率较高的“关键词”予以视觉上的突出,形成“关键词云层”或“关键词渲染”,从而过滤掉大量的文本信息,使浏览网页者只要一眼扫过文本就可以领略文本的主旨。
- 词频
- 分词 语句切割
import jieba mystr = "小姐姐,我看你挺能睡的,睡我还不好" wordsplitList = jieba.cut(mystr, cut_all=True) # 切割, 全部切割 print(wordsplitList) # 返回一个生成器对象 print('/'.join(wordsplitList)) wordsplitListforSearch = jieba.cut_for_search(mystr) # 按搜索方式切割 print(wordsplitListforSearch) print('/'.join(wordsplitListforSearch))
- 制作python岗位需求词云
import wordcloud 导入词云 from wordcloud import STOPWORDS # 停止词 import jieba import numpy as np # 科学计算 import matplotlib # 数据可视化 from matplotlib import pyplot as plt from PIL import Image # 图片处理 # 读取文本 pythonInfo = open('pythonworkinfo.txt', 'r', encoding='utf-8', errors='ignore').read() # print(pythonInfo) # 切割 pythonCut = jieba.cut(pythonInfo, cut_all=True) pythonInfoList = ' '.join(pythonCut) # 返回一个生成器对象 print(pythonInfoList) backgroud = np.array(Image.open('pig.jpg')) # 将图片格式化成RBG数组 myCloudword = wordcloud.WordCloud(font_path='simkai.ttf', # 字体路径 width=400, height=200, mask=backgroud, # 字体颜色 scale=1, # 比例 max_words=200, # 最大字数 min_font_size=4, # 最小字体 stopwords=STOPWORDS, # 默认停止词 random_state=50, # 随机角度 background_color='black', # 背景颜色 max_font_size=100 # 最大字体 ).generate(pythonInfoList) #plt.imshow(myCloudword) #plt.show() 图片展示 plt.figimage(mywordCloud) #绘制图片 plt.imsave('python.png',mywordCloud) #保存图片
精简生成词云
import matplotlib.pyplot as plt from wordcloud import WordCloud import jieba text_from_file_with_apath = open('pythonworkinfo.txt',encoding='utf-8',errors='ignore').read() print(text_from_file_with_apath) wordlist_after_jieba = jieba.cut(text_from_file_with_apath, cut_all=True) wl_space_split = " ".join(wordlist_after_jieba) my_wordcloud = WordCloud().generate(wl_space_split) plt.imshow(my_wordcloud) plt.axis("off") plt.show() #注:碰到utf-8的编码问题时候,可以去源码wordcloud.py文件中新增路径,前提下好中文字体库simkai.ttf FONT_PATH = os.environ.get("FONT_PATH", os.path.join(os.path.dirname(__file__), "simkai.ttf")) 覆盖掉默认的DroidSansMono.ttf
4 Matplotlib 绘图
1 多个subplot
# subplot.py import matplotlib.pyplot as plt import numpy as np data = np.arange(100, 201) plt.subplot(2, 1, 1) plt.plot(data) data2 = np.arange(200, 301) plt.subplot(2, 1, 2) plt.plot(data2) plt.show()
2 线形图
# plot.py import matplotlib.pyplot as plt plt.plot([1, 2, 3], [3, 6, 9], '-r') plt.plot([1, 2, 3], [2, 4, 9], ':g') plt.show()
这段代码说明如下:
-
plot
函数的第一个数组是横轴的值,第二个数组是纵轴的值,所以它们一个是直线,一个是折线; - 最后一个参数是由两个字符构成的,分别是线条的样式和颜色。前者是红色的直线,后者是绿色的点线。
3 散点图
# scatter.py import matplotlib.pyplot as plt import numpy as np N = 20 plt.scatter(np.random.rand(N) * 100, np.random.rand(N) * 100, c='r', s=100, alpha=0.5) plt.scatter(np.random.rand(N) * 100, np.random.rand(N) * 100, c='g', s=200, alpha=0.5) plt.scatter(np.random.rand(N) * 100, np.random.rand(N) * 100, c='b', s=300, alpha=0.5) plt.show()
这段代码说明如下:
- 这幅图包含了三组数据,每组数据都包含了20个随机坐标的位置
- 参数
c
表示点的颜色,s
是点的大小,alpha
是透明度
4 饼状图
# pie.py import matplotlib.pyplot as plt import numpy as np labels = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] data = np.random.rand(7) * 100 plt.pie(data, labels=labels, autopct='%1.1f%%') plt.axis('equal') plt.legend() plt.show()
这段代码说明如下:
-
data
是一组包含7个数据的随机数值 - 图中的标签通过
labels
来指定 -
autopct
指定了数值的精度格式 -
plt.axis('equal')
设置了坐标轴大小一致 -
plt.legend()
指明要绘制图例(见下图的右上角)
5 条形图
# bar.py import matplotlib.pyplot as plt import numpy as np N = 7 x = np.arange(N) data = np.random.randint(low=0, high=100, size=N) colors = np.random.rand(N * 3).reshape(N, -1) labels = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] plt.title("Weekday Data") plt.bar(x, data, alpha=0.8, color=colors, tick_label=labels) plt.show()
这段代码说明如下:
- 这幅图展示了一组包含7个随机数值的结果,每个数值是[0, 100]的随机数
- 它们的颜色也是通过随机数生成的。
np.random.rand(N * 3).reshape(N, -1)
表示先生成21(N x 3)个随机数,然后将它们组装成7行,那么每行就是三个数,这对应了颜色的三个组成部分。如果不理解这行代码,请先学习一下Python 机器学习库 NumPy 教程 -
title
指定了图形的标题,labels
指定了标签,alpha
是透明度
6 直方图
# hist.py import matplotlib.pyplot as plt import numpy as np data = [np.random.randint(0, n, n) for n in [3000, 4000, 5000]] labels = ['3K', '4K', '5K'] bins = [0, 100, 500, 1000, 2000, 3000, 4000, 5000] plt.hist(data, bins=bins, label=labels) plt.legend() plt.show()
上面这段代码中,[np.random.randint(0, n, n) for n in [3000, 4000, 5000]]
生成了包含了三个数组的数组,这其中:
- 第一个数组包含了3000个随机数,这些随机数的范围是 [0, 3000)
- 第二个数组包含了4000个随机数,这些随机数的范围是 [0, 4000)
- 第三个数组包含了5000个随机数,这些随机数的范围是 [0, 5000)

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
最新2018年6月份Wordpress通杀全版本漏洞 详情及利用方法
2018年6月29日,wordpress爆出最新漏洞,该网站漏洞通杀所有wordpress版本,包括目前的wordpress 4.8.6 以及wordpress 4.9.6版本。可以删除网站上的任意文件,影响危害严重,甚至是致命的一个漏洞,如果被攻击者利用,后果将不堪设想。截止目前该漏洞还未有被修复,如果您在使用wordpress,请尽快将wp-includes文件夹下的post.php文件改名,等官方出wordpress漏洞补丁后,再改回并升级。wordpress是许多站长以及建站公司,个人博客都比较喜欢的一套内容管理系统,也是目前互联网占有率较高的一套网站系统,国外以及外贸公司用的也比较多,因为wordpress在google优化上比较好,下面我们来分析下该wordpress漏洞是如何产生的:网站漏洞产生的文件存在于wp-includes/post.php中,如下图: 在第五行的if ( ! empty($meta['thumb']) ) {代码中,thumb变量值是可以调用来自于图片,或者网站数据库的一个值,整体代码在写的时候并没有对thumb的值进行安全过滤与判断内容是否 含有...
- 下一篇
Java多线程-实例解析
Java多线程-实例解析 Java多线程实例 3种实现方法 Java中的多线程有三种实现方式: 1.继承Thread类,重写run方法。Thread本质上也是一个实现了Runnable的实例,他代表一个线程的实例,并且启动线程的唯一方法就是通过Thread类的start方法。 2.实现Runnable接口,并实现该接口的run()方法.创建一个Thread对象,用实现的Runnable接口的对象作为参数实例化Thread对象,调用此对象的start方法。 3.实现Callable接口,重写call方法。Callable接口与Runnable接口的功能类似,但提供了比Runnable更强大的功能。有以下三点 1).Callable可以在人物结束后提供一个返回值,Runnable没有提供这个功能。 2).Callable中的call方法可以抛出异常,而Runnable的run方法不能抛出异常。 3).运行Callable可以拿到一个Future对象,表示异步计算的结果,提供了检查计算是否完成的方法。 需要注意的是,无论用那种方式实现了多线程,调用start方法并不意味着立即执行多线程代码,...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2全家桶,快速入门学习开发网站教程
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2整合Thymeleaf,官方推荐html解决方案