美文网首页解密大数据文科生零基础学Python数据分析python开发
文科生学Python系列13: matplotlib绘图/条形图

文科生学Python系列13: matplotlib绘图/条形图

作者: Lochaiching | 来源:发表于2017-09-09 22:25 被阅读1023次

    第七课 - 数据可视化

    本课内容:

    matplotlib 绘图基础

          函数曲线的绘制

          图形细节的设置

    案例分析:销售记录可视化

          条形图

         绘制多图

         饼图

         散点图

         直方图

    seaborn 数据可视化包

         分类数据的散点图

         分类数据的箱线图

         多变量图

    回顾:在之前课程中, 我们已经接触到了数据可视化

    在第五节课中,我们通过pandas的plot函数对莺尾花数据进行了可视化。我们绘制了根据品种分类的散点图和箱线图。

    在第六节课中,我们使用matplotlib绘制了姓名变化趋势图,并通过plt的各种选项对图形进行了美化。

    上述例子中可视化都是基于matplotlib来展开的,在本次课程中我们将详细演示如何使用matplotlib

    matplotlib 是Python编程语言的一个绘图库,最初由John D. Hunter撰写。

    与Python的深度集成

    风格与Matlab接近

    官网:http://matplotlib.org/

    matplotlib例图

    老师说,我们为什么今天要上新的 matplotlib 的绘图呢,因为之前学的鸢尾花散点图用的是Pandas里面自带的plot图,在分类数据的分析上,之前学的方法显得冗余了。为了更好的可视化,不冗余!我们来学新的!

    matplotlib 绘图基础

    导入数据包,设置基础

    以上还是一样设置基础数据,每一次都要导入的numpy和 pandas包,不导入后面会跟你说没有定义,识别不了的哦~ 设置图形的格式是 retina 的清晰度。运行之后,我们来正式绘图吧!

    在matplotlib 中,绘制一个曲线图,可以使用plt.plot这个函数,在正弦函数中,主要的是x和y轴两个轴的数据。所以我们需要先设置x 和 y 。

    我们用numpy中的arange函数,设置的是从0到5,间隔为0.1之间的数据。专业点来讲,0.1好像叫步长。当时上课这个语句一晃而过,我没看懂是什么为什么括号里面有三个数字,回放听终于明白了。。。明明是学过的啊😤😤😤

    x, y=sin(x)

    突然觉得,中学时代不会Python真可惜,或许时不时用它来解决数学问题,数学成绩就没那么差了。周三上课的时候余老师一讲到正弦函数我就有点头大,幸好不是要我计算呀!

    plt.plot(x,y)

    看到这里才发现,x 和y 用的都是 np 的函数,在np里面定义赋值。为什么不是pandas呢?

    老师说因为我们前面设置过自动显示图片(终于明白第一张图的 “%matplotlib Inline” 的作用了。。。),所以这里直接输入语句,按输出,就可以看到结果了。我们也可以设置成手动显示图片,看下图:

    手动显示图片

    plt.show( ) 这个语句,设置手动显示图片,而且这里没有 OUT这个显示了。其实这个我不知道有什么用。

    接下来又是(我不懂的)美化啦!

    增加 color='g',marker='.',linewidth=2

    把函数线的颜色设置成绿色,上课的时候我说为什么它知道g就是绿色啊!老师说用的 green 比 grey 多,所以系统会默认 g 是 green。上课讲的时候可没有color=g 啊,老师用的是简写,直接在 plt.plot(x,y) 中的右边括号里面加上逗号和 'g . -' ,然后就是绿色➕点线条了。

    现在看到的图两轴还是有些是空白,所以需要美化,缩减空白,这里用的是我们第六课用的方法:

    xlim,.ylim

    plt.xlim(0,5) 和 plt.ylim(-1.1,1.1) 的使用可以让区间空白改变一点,这次老师教了一种新的方法:

    plt.axis([0,5,-1.1,1.1])

    plt.axis([0,5,-1.1,1.1]) ,和上节课的xlim, ylim 使用结果一样,这个语句更短,先定义 x 轴的范围从0到5,再定义 y 轴的范围,所以在圆括号里面,有一个方括号,包着四个数字,分别表示两个轴的范围。

    要是我们需要清晰看到一个点所在的横纵坐标,需要用网格线进行更精确的定位,在那个点标明文字:

    plt.grid(True)

    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 三个函数的曲线

    y=x, y=x^2, y=x^3

    我在看预习资料的时候,看不到运行出来的图,plt.plot(x,x,x,x**2,x,x**3) ,这一句看起来太复杂有点可怕,然而它的意思竟然是,里面的6个数字分为三对xy轴的数。三个函数的x 和 y 竟然可以全部挤在一起,厉害了。

    要是想要更好的区分这三个函数曲线,可以用一些设置将它们变得更有辨识度:

    plt.plot(x,x,'r--',x,x**2,'bs',x,x**3,'g^')

    上课看老师运行这一步的时候,惊呆了。这里就是上面提到过的简写了,具体代表什么,# 后面已经说明了。接下来还是继续美化显示的图片了,大家可以自己做一下啦!这里不展示了。

    小结:

    上述代码展示了matplotlib的一些基本功能,我们可以通过使用plt自带的各种函数来控制图形的细节,比如是否加网格,坐标的标签等等。

    我们在后续课程中还会向大家展示其他常用图形

    案例分析:销售记录可视化

    导入并观察数据

    每次看到数据导入我就特别害怕,因为每次都会卡我很久,久到我会想“要不这文章就这样吧,老子不写了。” 每一次的坑我都记得非常清楚,红酒质量的,鸢尾花的,全美婴儿姓名的,这次是销售数据。

    这次卡了多久?

    一小时30分钟。

    读取数据失败的我,拿起等了我3个小时三明治,一边吃一边苦闷地想,这样的事情真是太丢人了啊,同一个坑,掉第四次。吃完这次终于上网查怎么在jupyter导入excel数据了(以前我都在干嘛?!)但是并没有查到要的答案,终于在我们课程的讨论区,看到一个同学回复的答案!老泪纵横!!!

    怎么导入数据到jupyter

    试了一下,上载成功的文件在jupyter打开是一片空白,而且把这个空白的文件下载到电脑了,我以为操作出了问题,试了几次,一模一样。把代码敲进去试着运行,竟然!成功运行了。。。诡异!

    读取excel数据文件

    这是一份一家公司在某个时间段段交易数据。行首对应的分别是客户账号/公司名称/商品货号/每次交易的购货量/每个商品的交易价格/交易总额/交易时间。

    要是你是一个数据分析师,想要在这份数据里面得到一些信息,你会从哪方面着手呢?

    我们可以用之前学过的一些函数进行对整份数据进行分析:

    df.info()

    这是一份有1500条信息的数据,没有缺失值。

    查看与之交易的公司数量

    要是需要看与之交易的公司有哪些,可以把上面运行语句的 len( ) 去除掉。

    要是需要看某家公司的交易量,也是可以用函数进行输出的:

    Barton LLC交易量(1) Barton LLC交易量(2)

    这个输出比较长,分两张展示首尾,最后一行可以看出,一共82笔交易。

    销售额最高的10个公司

    交易总额和交易次数的输出

    先用语句求出我们要的数。套路都是我们之前学过的:用groupby分组,也就是找到交易量的公司,先圈出范围“name”,然后是“ext price” 。然后使用agg进行聚合运算:sum求交易总额,count计算交易次数。

    但是在上面我们可以看到,行首的格式不是很对,这里需要调整一下:

    reset_index 重置索引

    这里在前面一行加了 ' \ '这样的符号,老师说这样加上去可以让它换行,看了结果,应该是让name 这个词在行首回到了好看的位置。reset_index 重置索引,里面写的 “在这里取消了name作为索引”,我没理解明白,也就是前面是用name来索引的?用name来索引和这一步的操作,作为索引来说,有什么不同?

    这时候我们已经得到销售总额的数据了,但是我们的题目是需要销售总额前十的,所以我们需要对销售总额进行排序。

    sort_values进行排序

    这里学到一个新的函数了,用 sort_values 进行排序。

    好吧,前十还没出来:

    top10

    这一步加了挺多东西上去的。重新再句首赋值 top10,后面输出 top10。在第27条输出了排前的销售额,才能直接在这一步的第二行代码最后直接使用切片的方式 [:10] 来运算。

    然后是对行首名称对修改,把首字母都大写了,替换的方式是使用字典的键值对,格式是 {之前的值:替换上的值} ,老师运行的第一遍没有加上inplace=true,结果就是并没有修改成功,然后解释,因为rename那一行算是里面默认的副本,要是没有inplace=true ,那是运行不成功的。

    我们总算把销售额前十的公司输出来了!

    条形图

    top10公司销售总额的条形图

    plt.barh(np.arange(10),top10.Sales,height=0.5)

    新的图!之前我们学过有scatter散点图,plot折线图,还有啥来着?今天的直方图是bar,哦,垂直的是bar,水平方向的直方图是barh。

    所有的代码,其实都能看懂。但是要我自己不偷看打出来,真的是。。。心虚。

    添加标题和横纵坐标的说明。并且,为了让图看起来更加知道相对应的值是什么,我们修改了坐标的刻度:

    plt.yticks(np.arange(10),top10.Name)

    觉得单看这个图好专业啊!这时候余老师讲了上课的第二个“冗余”,就是图和代码之间那串黑体字。这时候终于能够确切理解 冗余 这个词的表达力!要是不想看到这些多余的字,我们可以这样做:

    plt.show()

    有一种,把多余的毛发剃掉的感觉一样啊!!!!!清爽!

    然饿,老师这时候又去改X轴坐标了:

    plt.xticks

    其实这一段不是很明白,替换掉的值,不像上面用字典来替换,用的是两个列表,后面一个列表里面的元素还是字符串。这是我们之前学过的??疑惑。

    这个图的风格是默认的风格,老师说可以让我们尝试一下其他风格,选择之前看看有哪些是可以被选择的。这样的东西竟然都有语法,太可怕了!!!

    plt.style.available

    然后老师选了 ggplot,据说是 “爱原冢(音译)”的风格,来看看吧

    plt.style.use('ggplot')

    默认颜色变了,而且还有底版了:浅灰色+网格。


    作业7-1:

    模仿上面的例子,画出交易总数最高的10个公司的条形图。

    提示:可以使用sort_values(by= quantity) 来实现。

    啊啊啊,血槽空了,我去补补血,剩下这两天尽快更新!

    相关文章

      网友评论

      • Bog5d:天哪,肿么做到的啊,是跟着视频截图的,还是复现老师代码,然后截图的呢? 好仔细哦
        Lochaiching:@_bobo_ 视频截图的话,应该会不清晰的。

      本文标题:文科生学Python系列13: matplotlib绘图/条形图

      本文链接:https://www.haomeiwen.com/subject/emxajxtx.html