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