第七课 - 数据可视化
本课内容:
matplotlib 绘图基础
函数曲线的绘制
图形细节的设置 案例分析:销售记录可视化
条形图
绘制多图
饼图
散点图
直方图 seaborn 数据可视化包
分类数据的散点图
分类数据的箱线图
多变量图
回顾:在之前课程中, 我们已经接触到了数据可视化
在第五节课中,我们通过 pandas 的 plot 函数对莺尾花数据进行了可视化。我们绘制了根据品种分类的散点图和箱线图。
在第六节课中,我们使用 matplotlib 绘制了姓名变化趋势图,并通过 plt 的各种选项对图形进行了美化。
上述例子中可视化都是基于 matplotlib 来展开的,在本次课程中我们将详细演示如何使用matplotlib
matplotlib 是 Python 编程语言的一个绘图库,最初由 John D. Hunter 撰写。
与 Python 的深度集成
风格与 Matlab 接近
官网: http:// matplotlib.org/
![682994f7702837826f27115934e011e5.png](https://i-blog.csdnimg.cn/blog_migrate/cdc565f3afbfc9cb5aefd25c30ae4d5a.jpeg)
老师说,我们为什么今天要上新的 matplotlib 的绘图呢,因为之前学的鸢尾花散点图用的是 Pandas 里面自带的 plot 图,在分类数据的分析上,之前学的方法显得冗余了。为了更好的可视化,不冗余!我们来学新的!
matplotlib 绘图基础
![69f5ddd1b21c70dd6c3ddde4cc1e5782.png](https://i-blog.csdnimg.cn/blog_migrate/25f7a8b1bb041e67172e5b6bac7451a3.jpeg)
以上还是一样设置基础数据,每一次都要导入的 numpy 和 pandas 包,不导入后面会跟你说没有定义,识别不了的哦~ 设置图形的格式是 retina 的清晰度。运行之后,我们来正式绘图吧!
在matplotlib 中,绘制一个曲线图,可以使用 plt.plot 这个函数,在正弦函数中,主要的是 x 和 y 轴两个轴的数据。所以我们需要先设置 x 和 y 。
我们用 numpy 中的 arange 函数,设置的是从 0 到 5,间隔为 0.1 之间的数据。专业点来讲, 0.1 好像叫步长。当时上课这个语句一晃而过,我没看懂是什么为什么括号里面有三个数字,回放听终于明白了。。。明明是学过的啊
![ede9042e8c12358ef793192d73f2b55e.png](https://i-blog.csdnimg.cn/blog_migrate/07f123c7ee79a87817e335032e9137cd.jpeg)
突然觉得,中学时代不会 Python 真可惜,或许时不时用它来解决数学问题,数学成绩就没那么差了。周三上课的时候余老师一讲到正弦函数我就有点头大,幸好不是要我计算呀!
![08057d89279d6d8be385a925338b2b25.png](https://i-blog.csdnimg.cn/blog_migrate/e4af034f4f5e3a8e7e061a3140c68ee1.jpeg)
看到这里才发现,x 和 y 用的都是 np 的函数,在 np 里面定义赋值。为什么不是 pandas 呢?
老师说因为我们前面设置过自动显示图片(终于明白第一张图的 “%matplotlib Inline” 的作用了。。。),所以这里直接输入语句,按输出,就可以看到结果了。我们也可以设置成手动显示图片,看下图:
![155fdb3539f553c43612c0b96bef8ab5.png](https://i-blog.csdnimg.cn/blog_migrate/059b0650f7fe065eb2da50435a3104af.jpeg)
plt.show( ) 这个语句,设置手动显示图片,而且这里没有 OUT 这个显示了。其实这个我不知道有什么用。
接下来又是(我不懂的)美化啦!
![024020d9d58b3edbfd645094b6e86259.png](https://i-blog.csdnimg.cn/blog_migrate/9ac0b59bf47330ac774d12791cd2f7a3.jpeg)
把函数线的颜色设置成绿色,上课的时候我说为什么它知道 g 就是绿色啊!老师说用的 green 比 grey 多,所以系统会默认 g 是 green。上课讲的时候可没有 color=g 啊,老师用的是简写,直接在 plt.plot(x,y) 中的右边括号里面加上逗号和 'g . -' ,然后就是绿色➕点线条了。
现在看到的图两轴还是有些是空白,所以需要美化,缩减空白,这里用的是我们第六课用的方法:
![9703f5517787e64e6d768e736a733e1a.png](https://i-blog.csdnimg.cn/blog_migrate/9dfee5b6bf48c51bb9c3de256c159103.jpeg)
plt.xlim(0,5) 和 plt.ylim(-1.1,1.1) 的使用可以让区间空白改变一点,这次老师教了一种新的方法:
![91d7923ca23f652199225438154e7186.png](https://i-blog.csdnimg.cn/blog_migrate/798638f647db88eeeb6ed9e8a033d52e.jpeg)
plt.axis([0,5,-1.1,1.1]) ,和上节课的 xlim, ylim 使用结果一样,这个语句更短,先定义 x 轴的范围从 0 到 5,再定义 y 轴的范围,所以在圆括号里面,有一个方括号,包着四个数字,分别表示两个轴的范围。
要是我们需要清晰看到一个点所在的横纵坐标,需要用网格线进行更精确的定位,在那个点标明文字:
![4a2fc6988934a8f58d13715bed449f35.png](https://i-blog.csdnimg.cn/blog_migrate/dee4a9d1537dcf3f41aaab4eef64d1cc.jpeg)
plt.grid(True) 指的是网格线存在哦。
plt.text(3.1,0.3,'sin(x)') ,指的是在坐标(3.1,0.3)的位置上加上文字说明 sin(x)。
回顾例一,用 plot 函数得到一个基本的曲线函数,然后用各种细节设置,让整个图变得更加饱满,包括标题/横轴/纵轴/网格/文本等设置,这样的方法称为函数式的编程,这是模仿 matlib 的作图方式。与之相对应的还有面向对象的作图,它对细节的控制会更加丰富,但对初学者的掌握能力来说,学会函数式的编程比较适时。
例2:绘制 y=x, y=x^2, y=x^3 三个函数的曲线
![198bc75112cdf1c164e0fb0e789207bf.png](https://i-blog.csdnimg.cn/blog_migrate/d7909ee775f87174a0bcbb31c618643a.jpeg)
我在看预习资料的时候,看不到运行出来的图,plt.plot(x,x,x,x**2,x,x**3) ,这一句看起来太复杂有点可怕,然而它的意思竟然是,里面的 6 个数字分为三对 xy 轴的数。三个函数的 x 和 y 竟然可以全部挤在一起,厉害了。
要是想要更好的区分这三个函数曲线,可以用一些设置将它们变得更有辨识度:
![c6c259adc9d917a8b22f0da7e6b30571.png](https://i-blog.csdnimg.cn/blog_migrate/01369d5c14c9ea3c968294ab3fc4d8e9.jpeg)
上课看老师运行这一步的时候,惊呆了。这里就是上面提到过的简写了,具体代表什么,# 后面已经说明了。接下来还是继续美化显示的图片了,大家可以自己做一下啦!这里不展示了。
小结:
上述代码展示了matplotlib 的一些基本功能,我们可以通过使用 plt 自带的各种函数来控制图形的细节,比如是否加网格,坐标的标签等等。
我们在后续课程中还会向大家展示其他常用图形
案例分析:销售记录可视化
导入并观察数据
每次看到数据导入我就特别害怕,因为每次都会卡我很久,久到我会想“要不这文章就这样吧,老子不写了。” 每一次的坑我都记得非常清楚,红酒质量的,鸢尾花的,全美婴儿姓名的,这次是销售数据。
这次卡了多久?
一小时 30 分钟。
读取数据失败的我,拿起等了我 3 个小时三明治,一边吃一边苦闷地想,这样的事情真是太丢人了啊,同一个坑,掉第四次。吃完这次终于上网查怎么在 jupyter 导入 excel 数据了(以前我都在干嘛?!)但是并没有查到要的答案,终于在我们课程的讨论区,看到一个同学回复的答案!老泪纵横!!!
![0a839cc8f7f09123ed188db82558670a.png](https://i-blog.csdnimg.cn/blog_migrate/85083c383b7601dad9818f10d70c8352.jpeg)
试了一下,上载成功的文件在 jupyter 打开是一片空白,而且把这个空白的文件下载到电脑了,我以为操作出了问题,试了几次,一模一样。把代码敲进去试着运行,竟然!成功运行了。。。诡异!
![f995c51815ea2f0f0a71267b2152c8b9.png](https://i-blog.csdnimg.cn/blog_migrate/a9f6272f6b4212d6c839990b60d6e5b6.jpeg)
这是一份一家公司在某个时间段段交易数据。行首对应的分别是客户账号/公司名称/商品货号/每次交易的购货量/每个商品的交易价格/交易总额/交易时间。
要是你是一个数据分析师,想要在这份数据里面得到一些信息,你会从哪方面着手呢?
我们可以用之前学过的一些函数进行对整份数据进行分析:
![01a559c0bcbce5411a594bfdca2999ca.png](https://i-blog.csdnimg.cn/blog_migrate/31a3be07bcf9a9a9d2bf70ca1d45217f.jpeg)
这是一份有 1500 条信息的数据,没有缺失值。
![8f693cf7cc128deddb91dcf90fc34608.png](https://i-blog.csdnimg.cn/blog_migrate/8da7ee69da3563c24fbe07d9c3510972.jpeg)
要是需要看与之交易的公司有哪些,可以把上面运行语句的 len( ) 去除掉。
要是需要看某家公司的交易量,也是可以用函数进行输出的:
![b3360e76ce15474382b01db966a085b4.png](https://i-blog.csdnimg.cn/blog_migrate/fffca71103c0c1102f37dd4780759c22.jpeg)
![88a585e771e1a879978bb2e3e93f23a5.png](https://i-blog.csdnimg.cn/blog_migrate/69d5d31fe63f9ddc0d80b6a88f12b763.jpeg)
这个输出比较长,分两张展示首尾,最后一行可以看出,一共 82 笔交易。
销售额最高的 10 个公司
![cc7e50ec06de29c4a25b9e9d1d5a9ca9.png](https://i-blog.csdnimg.cn/blog_migrate/b29ccd767b48518740fcd193c3dd97bb.jpeg)
先用语句求出我们要的数。套路都是我们之前学过的:用 groupby 分组,也就是找到交易量的公司,先圈出范围“name”,然后是“ext price” 。然后使用 agg 进行聚合运算:sum 求交易总额,count 计算交易次数。
但是在上面我们可以看到,行首的格式不是很对,这里需要调整一下:
![4afdf7851e376dd5caf2f3501dd5ae3e.png](https://i-blog.csdnimg.cn/blog_migrate/4f08dbba4279a1539bcb0e66800b718b.jpeg)
这里在前面一行加了 ' '这样的符号,老师说这样加上去可以让它换行,看了结果,应该是让name 这个词在行首回到了好看的位置。reset_index 重置索引,里面写的 “在这里取消了name 作为索引”,我没理解明白,也就是前面是用 name 来索引的?用 name 来索引和这一步的操作,作为索引来说,有什么不同?
这时候我们已经得到销售总额的数据了,但是我们的题目是需要销售总额前十的,所以我们需要对销售总额进行排序。
![05201945823f4e126789425e7154815b.png](https://i-blog.csdnimg.cn/blog_migrate/5c2d0380339dac5fe11b89badd17c2f9.jpeg)
这里学到一个新的函数了,用 sort_values 进行排序。
好吧,前十还没出来:
![d557b89a6b8f41240d1e64c36698be87.png](https://i-blog.csdnimg.cn/blog_migrate/b4ee51205d0c6a02f4318d16d1b595c6.jpeg)
这一步加了挺多东西上去的。重新再句首赋值 top10,后面输出 top10。在第 27 条输出了排前的销售额,才能直接在这一步的第二行代码最后直接使用切片的方式 [:10] 来运算。
然后是对行首名称对修改,把首字母都大写了,替换的方式是使用字典的键值对,格式是 {之前的值:替换上的值} ,老师运行的第一遍没有加上 inplace=true,结果就是并没有修改成功,然后解释,因为 rename 那一行算是里面默认的副本,要是没有 inplace=true ,那是运行不成功的。
我们总算把销售额前十的公司输出来了!
条形图
top10 公司销售总额的条形图
![24d71d9585d119df13ae0666f10826de.png](https://i-blog.csdnimg.cn/blog_migrate/8977dae5b25f12754990163a38a3aa3e.jpeg)
新的图!之前我们学过有 scatter 散点图,plot 折线图,还有啥来着?今天的直方图是 bar,哦,垂直的是 bar,水平方向的直方图是 barh。
所有的代码,其实都能看懂。但是要我自己不偷看打出来,真的是。。。心虚。
添加标题和横纵坐标的说明。并且,为了让图看起来更加知道相对应的值是什么,我们修改了坐标的刻度:
![269615df31303ff190bcbd60583264ca.png](https://i-blog.csdnimg.cn/blog_migrate/fe8903509f8265057d22e518ebae0b9d.jpeg)
觉得单看这个图好专业啊!这时候余老师讲了上课的第二个“冗余”,就是图和代码之间那串黑体字。这时候终于能够确切理解 冗余 这个词的表达力!要是不想看到这些多余的字,我们可以这样做:
![aceb09cc74262c2dc0a816b3049523dc.png](https://i-blog.csdnimg.cn/blog_migrate/99cd9d98f0f9923e1f2fd74a0e592732.jpeg)
有一种,把多余的毛发剃掉的感觉一样啊!!!!!清爽!
然饿,老师这时候又去改 X 轴坐标了:
![dd21f5fc3cbed0ab8ddf8b89a270bd4e.png](https://i-blog.csdnimg.cn/blog_migrate/5da7903418af85c68007cda8d97e4312.jpeg)
其实这一段不是很明白,替换掉的值,不像上面用字典来替换,用的是两个列表,后面一个列表里面的元素还是字符串。这是我们之前学过的??疑惑。
这个图的风格是默认的风格,老师说可以让我们尝试一下其他风格,选择之前看看有哪些是可以被选择的。这样的东西竟然都有语法,太可怕了!!!
![17542f4b91a99d5f943b9c027b73fb21.png](https://i-blog.csdnimg.cn/blog_migrate/8d8177bb7d2474508ffa1b04ea78191d.jpeg)
然后老师选了 ggplot,据说是 “爱原冢(音译)”的风格,来看看吧
![5b7c8296a21c97e377038807715f18b4.png](https://i-blog.csdnimg.cn/blog_migrate/bad6b67a0d62c4c8dded0961e8c4517c.jpeg)
默认颜色变了,而且还有底版了:浅灰色+网格。
作业 7-1:
模仿上面的例子,画出交易总数最高的 10 个公司的条形图。
提示:可以使用 sort_values(by= quantity) 来实现。
啊啊啊,血槽空了,我去补补血,剩下这两天尽快更新!
文科生学Python系列13: matplotlib绘图/条形图www.jianshu.com![58961fb2b671857d2fec7e1743cc2414.png](https://i-blog.csdnimg.cn/blog_migrate/42cc447af03528b75cfe71be052e6934.jpeg)